{
  "scan": "Transport and Logistics — Crane Index (AI Visibility Suite)",
  "cohort": "transport-logistics",
  "date": "2026-09-01",
  "scanners": {
    "retrieval": "AI Search Readiness",
    "execution": "Agent Readiness",
    "representation": "Brand Representation"
  },
  "concurrency": 10,
  "pages": 1,
  "basis": "page",
  "aggregate": {
    "scannedRequested": 176,
    "reachable": 110,
    "unreachable": 66,
    "retrieval": {
      "n": 110,
      "min": 14,
      "max": 84,
      "median": 51,
      "mean": 50,
      "ge70": 10,
      "b5569": 37,
      "b4054": 40,
      "lt40": 23,
      "below55": 63,
      "ge90": 0
    },
    "execution": {
      "n": 110,
      "min": 30,
      "max": 89,
      "median": 63,
      "mean": 64,
      "ge70": 25,
      "b5569": 67,
      "b4054": 6,
      "lt40": 12,
      "below55": 18,
      "ge90": 0
    },
    "representation": {
      "n": 110,
      "min": 8,
      "max": 58,
      "median": 14,
      "mean": 21,
      "ge70": 0,
      "b5569": 2,
      "b4054": 18,
      "lt40": 90,
      "below55": 108,
      "ge90": 0
    },
    "composite": {
      "n": 110,
      "min": 19,
      "max": 73,
      "median": 43,
      "mean": 45,
      "ge70": 2,
      "b5569": 27,
      "b4054": 38,
      "lt40": 43,
      "below55": 81,
      "ge90": 0
    }
  },
  "escalations": [],
  "recoveries": [],
  "companies": [
    {
      "name": "FedEx",
      "domain": "fedex.com",
      "ok": true,
      "finalUrl": "https://www.fedex.com/",
      "offDomain": "fedex.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 18,
        "execution": 34,
        "representation": 15,
        "composite": 22
      },
      "detail": {
        "retrieval": {
          "score": 18,
          "band": "Largely invisible to AI",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 3,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, LocalBusiness or Person markup found.",
                  "rec": "Declare an Organisation (or LocalBusiness / Person) entity in JSON-LD so AI engines can identify and attribute you by name."
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 0,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No JSON-LD found.",
                  "rec": "Add JSON-LD structured data; it is how a machine reads your facts rather than guessing them."
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 0,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "1 of 2 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": "Write several concise, self-contained paragraphs (roughly 40 to 450 characters, at least eight words each) that each answer a real question, rather than long unbroken blocks or repeated one-liners."
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "0 H1, 0 H2, 0 H3.",
                  "rec": "Use exactly one H1, then H2/H3 to structure the content a model parses."
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 45,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "About 48 words of readable text.",
                  "rec": "Give models enough clean, standalone prose to quote. This measures depth, not quality; a focused page can be cited at lower length, but very thin pages rarely are."
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 19 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No meta description found.",
                  "rec": "Add a clear meta description."
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 2 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No lists, landmarks or header tables found.",
                  "rec": "Use lists, <main>/<article> landmarks and tables with <th> headers; they help AI parsers isolate and extract your content cleanly."
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 61,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "llms.txt present (1,766 characters); read today by coding and agent tools.",
                  "rec": null
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No canonical link found.",
                  "rec": "Declare a canonical URL so engines consolidate signals on one address."
                },
                {
                  "label": "Sitemap",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "A sitemap exists but carries no lastmod dates.",
                  "rec": "Publish a sitemap.xml with lastmod dates and reference it in robots.txt."
                },
                {
                  "label": "Social / Open Graph",
                  "status": "fail",
                  "weight": 1,
                  "detail": "0/3 Open Graph tags, no Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "fail",
                  "weight": 0.75,
                  "detail": "HTTPS, no viewport, no lang.",
                  "rec": "Serve over HTTPS, add a responsive viewport meta tag, and set an html lang attribute."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No H1 heading on the page"
            },
            {
              "sev": "warning",
              "label": "Missing meta description"
            },
            {
              "sev": "warning",
              "label": "No canonical URL declared"
            },
            {
              "sev": "warning",
              "label": "Thin content (under 250 words)"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 34,
          "band": "Closed to agents",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 45,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "partial",
                  "weight": 2,
                  "detail": "No HTML form on this page, so an agent cannot complete a form-based task here.",
                  "rec": "Provide real <form> elements with a real action attribute, named inputs and <label>/aria-label, and no honeypot trap, so an agent can read and complete the task. Forms wired only in JavaScript are invisible to non-rendering agents."
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Very little static content (~48 words); agents that do not run JavaScript will see almost nothing.",
                  "rec": "Server-render or pre-render the primary content and controls. Agents and most crawlers do not execute JavaScript, so a client-rendered action surface is invisible to them."
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 100,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "llms.txt declares transactional or API surfaces for agents.",
                  "rec": null
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            },
            {
              "sev": "error",
              "label": "Action surface appears client-side rendered; agents may see little"
            },
            {
              "sev": "warning",
              "label": "Reachable but nothing to operate (little content, no action, no form)"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 15,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, Brand or Person entity in structured data.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 0,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Few extractable, quotable claims; little for a model to cite back to you.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 100,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "pass",
                  "weight": 1,
                  "detail": "You actively govern representation: TDM reservation. (no training opt-out declared.)",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No machine-readable entity (Organisation / Brand / Person)"
            },
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "UPS",
      "domain": "ups.com",
      "ok": false,
      "reason": "UNREACHABLE (no response)",
      "wafVendor": ""
    },
    {
      "name": "DHL",
      "domain": "dhl.com",
      "ok": false,
      "reason": "UNREACHABLE (no response)",
      "wafVendor": ""
    },
    {
      "name": "United States Postal Service",
      "domain": "usps.com",
      "ok": true,
      "finalUrl": "https://www.usps.com/",
      "offDomain": "usps.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 65,
        "execution": 89,
        "representation": 28,
        "composite": 61
      },
      "detail": {
        "retrieval": {
          "score": 65,
          "band": "Partly legible",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 58,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "pass",
                  "weight": 2,
                  "detail": "Entity type declared: Organization.",
                  "rec": null
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "pass",
                  "weight": 2,
                  "detail": "4 distinct external profiles linked via sameAs.",
                  "rec": null
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Logo and contact details in structured data.",
                  "rec": null
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 32,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 valid JSON-LD block(s).",
                  "rec": null
                },
                {
                  "label": "Linked entity graph",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Uses @graph / @id, but the page does not reference a subject entity.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 67,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "39 of 93 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 H1, 9 H2, 48 H3.",
                  "rec": null
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 80,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 2000 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Title is 14 characters.",
                  "rec": "Aim for a 15 to 70 character title that states who you are and what you do."
                },
                {
                  "label": "Meta description quality",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Meta description is 222 characters.",
                  "rec": "Aim for a 70 to 180 character description; it is often quoted verbatim as your summary."
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 53 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 96,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "pass",
                  "weight": 1,
                  "detail": "3/3 Open Graph tags plus a Twitter card.",
                  "rec": null
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "1 insecure HTTP resource on a secure page"
            },
            {
              "sev": "warning",
              "label": "Meta description over 180 characters"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 89,
          "band": "Agent-operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 71,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "pass",
                  "weight": 2.5,
                  "detail": "A consequential action is described in schema.",
                  "rec": null
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 100,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "pass",
                  "weight": 2,
                  "detail": "9 form(s) with named, labelled inputs and a submittable action an agent can complete.",
                  "rec": null
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 2000 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A contact route (ContactPoint, mailto or tel) is available for an agent to hand off.",
                  "rec": null
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 28,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 29,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "partial",
                  "weight": 2,
                  "detail": "Entity declared (named), but thin: no description; no knowsAbout / areaServed / founder detail.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 30,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "1 confirmed and 0 unverified authoritative home(s) (of 3 declared; the rest did not resolve): twitter.com.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "Profile links are present, but no CONFIRMED authoritative registry (Wikidata, Companies House, OpenCorporates) anchors them.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 10,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "4 extractable signals (statistics, figures, quotations, definitions) a model can lift and attribute.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No usage terms found on the page (license, copyrightHolder, meta reservation), and the TDM reservation file (/.well-known/tdmrep.json) could not be read on this scan, so the declared-terms verdict is unmeasured rather than a definitive absence. (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 3,
              "reachable": 3,
              "confirmed": 1,
              "dead": 0,
              "links": [
                {
                  "host": "facebook.com",
                  "status": 200,
                  "state": "reachable"
                },
                {
                  "host": "twitter.com",
                  "status": 200,
                  "state": "confirmed"
                },
                {
                  "host": "youtube.com",
                  "status": 200,
                  "state": "reachable"
                }
              ],
              "scoringHosts": [
                "twitter.com"
              ],
              "confirmedHosts": [
                "twitter.com"
              ],
              "unverifiedHosts": []
            }
          },
          "tdmUnmeasured": true
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": [
        "tdmrep-unmeasured"
      ]
    },
    {
      "name": "Royal Mail",
      "domain": "royalmail.com",
      "ok": false,
      "reason": "BLOCKED (HTTP 403)",
      "wafVendor": "Akamai"
    },
    {
      "name": "DPD",
      "domain": "dpd.com",
      "ok": true,
      "finalUrl": "https://www.dpd.com/",
      "offDomain": "dpd.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 58,
        "execution": 30,
        "representation": 23,
        "composite": 37
      },
      "detail": {
        "retrieval": {
          "score": 58,
          "band": "Partly legible",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 42,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "pass",
                  "weight": 2,
                  "detail": "Entity type declared: Organization.",
                  "rec": null
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "pass",
                  "weight": 1,
                  "detail": "BreadcrumbList schema present.",
                  "rec": null
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 39,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "3 valid JSON-LD block(s).",
                  "rec": null
                },
                {
                  "label": "Linked entity graph",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Uses @graph / @id, but the page does not reference a subject entity.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Dates present in meta or <time> tags, but not in structured data.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 50,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "2 of 48 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": "Write several concise, self-contained paragraphs (roughly 40 to 450 characters, at least eight words each) that each answer a real question, rather than long unbroken blocks or repeated one-liners."
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 H1, 4 H2, 4 H3.",
                  "rec": null
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 85,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "About 372 words of readable text.",
                  "rec": "Give models enough clean, standalone prose to quote. This measures depth, not quality; a focused page can be cited at lower length, but very thin pages rarely are."
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 16 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 107 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 12 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 91,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "A sitemap exists but carries no lastmod dates.",
                  "rec": "Publish a sitemap.xml with lastmod dates and reference it in robots.txt."
                },
                {
                  "label": "Social / Open Graph",
                  "status": "pass",
                  "weight": 1,
                  "detail": "3/3 Open Graph tags plus a Twitter card.",
                  "rec": null
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "5 insecure HTTP resources on a secure page"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 30,
          "band": "Closed to agents",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 25,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "fail",
                  "weight": 3,
                  "detail": "Every probed AI agent is refused at the edge while a browser gets 200 (OAI-SearchBot 403, PerplexityBot 403, ClaudeBot 403, GPTBot 403).",
                  "rec": "Your CDN or WAF is refusing AI user-agents at the network layer, so the page is invisible to those agents regardless of robots.txt. If you intend to be agent-reachable, allow the retrieval user-agents (OAI-SearchBot, PerplexityBot, Claude-SearchBot) in your bot-management or Pay-Per-Crawl settings. Note: we test this by sending these user-agent strings from our scanner, so it measures how your edge treats the user-agent; a real agent presents the same string from its own network, making this a strong signal rather than a guarantee."
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 95,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "pass",
                  "weight": 2,
                  "detail": "2 form(s) with named, labelled inputs and a submittable action an agent can complete.",
                  "rec": null
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 372 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "AI agents are refused at the edge (CDN/WAF), not just in robots.txt"
            },
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 23,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 50,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "partial",
                  "weight": 2,
                  "detail": "Entity declared (DPD), but thin: no description; no knowsAbout / areaServed / founder detail.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Entity name is consistent across surfaces, but no legal identifier (company number, VAT, LEI) is declared.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 0,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Few extractable, quotable claims; little for a model to cite back to you.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "GLS",
      "domain": "gls-group.com",
      "ok": true,
      "finalUrl": "https://gls-group.com/",
      "offDomain": "gls-group.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 22,
        "execution": 57,
        "representation": 15,
        "composite": 31
      },
      "detail": {
        "retrieval": {
          "score": 22,
          "band": "Largely invisible to AI",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 3,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, LocalBusiness or Person markup found.",
                  "rec": "Declare an Organisation (or LocalBusiness / Person) entity in JSON-LD so AI engines can identify and attribute you by name."
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 0,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No JSON-LD found.",
                  "rec": "Add JSON-LD structured data; it is how a machine reads your facts rather than guessing them."
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 0,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "1 of 1 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": "Write several concise, self-contained paragraphs (roughly 40 to 450 characters, at least eight words each) that each answer a real question, rather than long unbroken blocks or repeated one-liners."
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "0 H1, 0 H2, 0 H3.",
                  "rec": "Use exactly one H1, then H2/H3 to structure the content a model parses."
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 50,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "About 82 words of readable text.",
                  "rec": "Give models enough clean, standalone prose to quote. This measures depth, not quality; a focused page can be cited at lower length, but very thin pages rarely are."
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 23 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No meta description found.",
                  "rec": "Add a clear meta description."
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 3 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 78,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "llms.txt present (20,019 characters); read today by coding and agent tools.",
                  "rec": null
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "A sitemap exists but carries no lastmod dates.",
                  "rec": "Publish a sitemap.xml with lastmod dates and reference it in robots.txt."
                },
                {
                  "label": "Social / Open Graph",
                  "status": "fail",
                  "weight": 1,
                  "detail": "1/3 Open Graph tags plus a Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No H1 heading on the page"
            },
            {
              "sev": "warning",
              "label": "Missing meta description"
            },
            {
              "sev": "warning",
              "label": "Thin content (under 250 words)"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 57,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 45,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "partial",
                  "weight": 2,
                  "detail": "1 form(s) with named inputs, but no action attribute: submission is wired in JavaScript, so a non-rendering agent has no endpoint to post to.",
                  "rec": "Provide real <form> elements with a real action attribute, named inputs and <label>/aria-label, and no honeypot trap, so an agent can read and complete the task. Forms wired only in JavaScript are invisible to non-rendering agents."
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Very little static content (~82 words); agents that do not run JavaScript will see almost nothing.",
                  "rec": "Server-render or pre-render the primary content and controls. Agents and most crawlers do not execute JavaScript, so a client-rendered action surface is invisible to them."
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 100,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "llms.txt declares transactional or API surfaces for agents.",
                  "rec": null
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            },
            {
              "sev": "error",
              "label": "Action surface appears client-side rendered; agents may see little"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 15,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, Brand or Person entity in structured data.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 0,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Few extractable, quotable claims; little for a model to cite back to you.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 100,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "pass",
                  "weight": 1,
                  "detail": "You actively govern representation: TDM reservation. (no training opt-out declared.)",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No machine-readable entity (Organisation / Brand / Person)"
            },
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "Evri",
      "domain": "evri.com",
      "ok": true,
      "finalUrl": "https://www.evri.com/",
      "offDomain": "evri.com",
      "truncated": true,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 22,
        "execution": 34,
        "representation": 18,
        "composite": 25
      },
      "detail": {
        "retrieval": {
          "score": 22,
          "band": "Largely invisible to AI",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 3,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, LocalBusiness or Person markup found.",
                  "rec": "Declare an Organisation (or LocalBusiness / Person) entity in JSON-LD so AI engines can identify and attribute you by name."
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 0,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No JSON-LD found.",
                  "rec": "Add JSON-LD structured data; it is how a machine reads your facts rather than guessing them."
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 0,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No paragraph content found.",
                  "rec": "Write several concise, self-contained paragraphs (roughly 40 to 450 characters, at least eight words each) that each answer a real question, rather than long unbroken blocks or repeated one-liners."
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "0 H1, 0 H2, 0 H3.",
                  "rec": "Use exactly one H1, then H2/H3 to structure the content a model parses."
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 45,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "About 27 words of readable text.",
                  "rec": "Give models enough clean, standalone prose to quote. This measures depth, not quality; a focused page can be cited at lower length, but very thin pages rarely are."
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 64 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No meta description found.",
                  "rec": "Add a clear meta description."
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No images to assess.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No lists, landmarks or header tables found.",
                  "rec": "Use lists, <main>/<article> landmarks and tables with <th> headers; they help AI parsers isolate and extract your content cleanly."
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 78,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "llms.txt present (200,000 characters); read today by coding and agent tools.",
                  "rec": null
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No canonical link found.",
                  "rec": "Declare a canonical URL so engines consolidate signals on one address."
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "fail",
                  "weight": 1,
                  "detail": "0/3 Open Graph tags, no Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No H1 heading on the page"
            },
            {
              "sev": "warning",
              "label": "Missing meta description"
            },
            {
              "sev": "warning",
              "label": "No canonical URL declared"
            },
            {
              "sev": "warning",
              "label": "Thin content (under 250 words)"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 34,
          "band": "Closed to agents",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 45,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "partial",
                  "weight": 2,
                  "detail": "No HTML form on this page, so an agent cannot complete a form-based task here.",
                  "rec": "Provide real <form> elements with a real action attribute, named inputs and <label>/aria-label, and no honeypot trap, so an agent can read and complete the task. Forms wired only in JavaScript are invisible to non-rendering agents."
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Very little static content (~27 words); agents that do not run JavaScript will see almost nothing.",
                  "rec": "Server-render or pre-render the primary content and controls. Agents and most crawlers do not execute JavaScript, so a client-rendered action surface is invisible to them."
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 100,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "llms.txt declares transactional or API surfaces for agents.",
                  "rec": null
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            },
            {
              "sev": "error",
              "label": "Action surface appears client-side rendered; agents may see little"
            },
            {
              "sev": "warning",
              "label": "Reachable but nothing to operate (little content, no action, no form)"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 18,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, Brand or Person entity in structured data.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 10,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "2 extractable signals (statistics, figures, quotations, definitions) a model can lift and attribute.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 100,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "pass",
                  "weight": 1,
                  "detail": "You actively govern representation: TDM reservation. (no training opt-out declared.)",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No machine-readable entity (Organisation / Brand / Person)"
            },
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "Yodel",
      "domain": "yodel.co.uk",
      "ok": true,
      "finalUrl": "https://www.yodel.co.uk/",
      "offDomain": "yodel.co.uk",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 39,
        "execution": 56,
        "representation": 8,
        "composite": 34
      },
      "detail": {
        "retrieval": {
          "score": 39,
          "band": "Significant gaps",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 3,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, LocalBusiness or Person markup found.",
                  "rec": "Declare an Organisation (or LocalBusiness / Person) entity in JSON-LD so AI engines can identify and attribute you by name."
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 0,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No JSON-LD found.",
                  "rec": "Add JSON-LD structured data; it is how a machine reads your facts rather than guessing them."
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 50,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "8 of 11 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "1 H1, 0 H2, 1 H3.",
                  "rec": "Add H2/H3 subheadings; a flat page is hard for a model to segment and quote."
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "About 383 words of readable text.",
                  "rec": "Give models enough clean, standalone prose to quote. This measures depth, not quality; a focused page can be cited at lower length, but very thin pages rarely are."
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 33 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Meta description is 15 characters.",
                  "rec": "Aim for a 70 to 180 character description; it is often quoted verbatim as your summary."
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 2 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 83,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "A sitemap exists but carries no lastmod dates.",
                  "rec": "Publish a sitemap.xml with lastmod dates and reference it in robots.txt."
                },
                {
                  "label": "Social / Open Graph",
                  "status": "partial",
                  "weight": 1,
                  "detail": "3/3 Open Graph tags, no Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "Heading levels skip from H1 to H3"
            },
            {
              "sev": "error",
              "label": "1 insecure HTTP resource on a secure page"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 56,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 63,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "partial",
                  "weight": 3,
                  "detail": "Some AI agents are refused at the edge while a browser gets 200 (OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 403).",
                  "rec": "Your CDN or WAF is refusing AI user-agents at the network layer, so the page is invisible to those agents regardless of robots.txt. If you intend to be agent-reachable, allow the retrieval user-agents (OAI-SearchBot, PerplexityBot, Claude-SearchBot) in your bot-management or Pay-Per-Crawl settings. Note: we test this by sending these user-agent strings from our scanner, so it measures how your edge treats the user-agent; a real agent presents the same string from its own network, making this a strong signal rather than a guarantee."
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 95,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "pass",
                  "weight": 2,
                  "detail": "1 form(s) with named, labelled inputs and a submittable action an agent can complete.",
                  "rec": null
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 383 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "Some AI agents refused at the edge (GPTBot)"
            },
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 8,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, Brand or Person entity in structured data.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 0,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Few extractable, quotable claims; little for a model to cite back to you.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No machine-readable entity (Organisation / Brand / Person)"
            },
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "InPost",
      "domain": "inpost.co.uk",
      "ok": false,
      "reason": "BLOCKED (HTTP 403)",
      "wafVendor": "Cloudflare"
    },
    {
      "name": "Aramex",
      "domain": "aramex.com",
      "ok": false,
      "reason": "BLOCKED (HTTP 403)",
      "wafVendor": ""
    },
    {
      "name": "GEODIS",
      "domain": "geodis.com",
      "ok": true,
      "finalUrl": "https://geodis.com/us-en",
      "offDomain": "geodis.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 48,
        "execution": 68,
        "representation": 25,
        "composite": 47
      },
      "detail": {
        "retrieval": {
          "score": 48,
          "band": "Significant gaps",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 25,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "pass",
                  "weight": 2,
                  "detail": "Entity type declared: Organization.",
                  "rec": null
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 32,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 valid JSON-LD block(s).",
                  "rec": null
                },
                {
                  "label": "Linked entity graph",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Uses @graph / @id, but the page does not reference a subject entity.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 33,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "1 of 12 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": "Write several concise, self-contained paragraphs (roughly 40 to 450 characters, at least eight words each) that each answer a real question, rather than long unbroken blocks or repeated one-liners."
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 H1, 3 H2, 16 H3.",
                  "rec": null
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 100,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 900 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 57 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 153 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 35 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 78,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "fail",
                  "weight": 1,
                  "detail": "0/3 Open Graph tags, no Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 68,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 95,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "pass",
                  "weight": 2,
                  "detail": "3 form(s) with named, labelled inputs and a submittable action an agent can complete.",
                  "rec": null
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 900 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 25,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 50,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "partial",
                  "weight": 2,
                  "detail": "Entity declared (GEODIS), but thin: no description; no knowsAbout / areaServed / founder detail.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Entity name is consistent across surfaces, but no legal identifier (company number, VAT, LEI) is declared.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 10,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "3 extractable signals (statistics, figures, quotations, definitions) a model can lift and attribute.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "PostNL",
      "domain": "postnl.nl",
      "ok": false,
      "reason": "UNREACHABLE (no response)",
      "wafVendor": ""
    },
    {
      "name": "bpost",
      "domain": "bpost.be",
      "ok": true,
      "finalUrl": "https://www.bpost.be/nl",
      "offDomain": "bpost.be",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 56,
        "execution": 87,
        "representation": 16,
        "composite": 53
      },
      "detail": {
        "retrieval": {
          "score": 56,
          "band": "Partly legible",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 31,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "pass",
                  "weight": 2,
                  "detail": "Entity type declared: Organization.",
                  "rec": null
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 21,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "2 valid JSON-LD block(s).",
                  "rec": null
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 67,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "20 of 46 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "1 question-led heading(s) or Q&A found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "2 H1, 6 H2, 1 H3.",
                  "rec": "Use exactly one H1, then H2/H3 to structure the content a model parses."
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 100,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1300 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 26 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 166 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 33 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 78,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "fail",
                  "weight": 1,
                  "detail": "0/3 Open Graph tags, no Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "Multiple H1 headings (2)"
            },
            {
              "sev": "error",
              "label": "1 insecure HTTP resource on a secure page"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 87,
          "band": "Agent-operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 71,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "pass",
                  "weight": 2.5,
                  "detail": "A consequential action is described in schema.",
                  "rec": null
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 95,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "pass",
                  "weight": 2,
                  "detail": "2 form(s) with named, labelled inputs and a submittable action an agent can complete.",
                  "rec": null
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1300 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 16,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 29,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "partial",
                  "weight": 2,
                  "detail": "Entity declared (named), but thin: no description; no knowsAbout / areaServed / founder detail.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 0,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Few extractable, quotable claims; little for a model to cite back to you.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "PostNord",
      "domain": "postnord.com",
      "ok": true,
      "finalUrl": "https://www.postnord.com/",
      "offDomain": "postnord.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 43,
        "execution": 58,
        "representation": 16,
        "composite": 39
      },
      "detail": {
        "retrieval": {
          "score": 43,
          "band": "Significant gaps",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 39,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "pass",
                  "weight": 2,
                  "detail": "Entity type declared: Organization.",
                  "rec": null
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No logo and contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Your entity carries some descriptive depth.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 32,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 valid JSON-LD block(s).",
                  "rec": null
                },
                {
                  "label": "Linked entity graph",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Uses @graph / @id, but the page does not reference a subject entity.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 17,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "2 of 2 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": "Write several concise, self-contained paragraphs (roughly 40 to 450 characters, at least eight words each) that each answer a real question, rather than long unbroken blocks or repeated one-liners."
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "0 H1, 2 H2, 0 H3.",
                  "rec": "Use exactly one H1, then H2/H3 to structure the content a model parses."
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 60,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "About 129 words of readable text.",
                  "rec": "Give models enough clean, standalone prose to quote. This measures depth, not quality; a focused page can be cited at lower length, but very thin pages rarely are."
                },
                {
                  "label": "Title quality",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Title is 72 characters.",
                  "rec": "Aim for a 15 to 70 character title that states who you are and what you do."
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 154 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 6 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 83,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "A sitemap exists but carries no lastmod dates.",
                  "rec": "Publish a sitemap.xml with lastmod dates and reference it in robots.txt."
                },
                {
                  "label": "Social / Open Graph",
                  "status": "partial",
                  "weight": 1,
                  "detail": "2/3 Open Graph tags plus a Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No H1 heading on the page"
            },
            {
              "sev": "warning",
              "label": "Title likely truncated in results (over 65 characters)"
            },
            {
              "sev": "warning",
              "label": "Thin content (under 250 words)"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 58,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 60,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "partial",
                  "weight": 2,
                  "detail": "No HTML form on this page, so an agent cannot complete a form-based task here.",
                  "rec": "Provide real <form> elements with a real action attribute, named inputs and <label>/aria-label, and no honeypot trap, so an agent can read and complete the task. Forms wired only in JavaScript are invisible to non-rendering agents."
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Only about 129 words in the static HTML; some content likely depends on JavaScript.",
                  "rec": "Server-render or pre-render the primary content and controls. Agents and most crawlers do not execute JavaScript, so a client-rendered action surface is invisible to them."
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 16,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 29,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "partial",
                  "weight": 2,
                  "detail": "Entity declared (named), but thin: no description.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 0,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Few extractable, quotable claims; little for a model to cite back to you.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "Austrian Post",
      "domain": "post.at",
      "ok": true,
      "finalUrl": "https://www.post.at/",
      "offDomain": "post.at",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 42,
        "execution": 63,
        "representation": 10,
        "composite": 38
      },
      "detail": {
        "retrieval": {
          "score": 42,
          "band": "Significant gaps",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 3,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, LocalBusiness or Person markup found.",
                  "rec": "Declare an Organisation (or LocalBusiness / Person) entity in JSON-LD so AI engines can identify and attribute you by name."
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 0,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No JSON-LD found.",
                  "rec": "Add JSON-LD structured data; it is how a machine reads your facts rather than guessing them."
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 50,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "19 of 48 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "1 H1, 1 H2, 0 H3.",
                  "rec": "Add H2/H3 subheadings; a flat page is hard for a model to segment and quote."
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 100,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1200 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 56 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 151 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 19 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 83,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "A sitemap exists but carries no lastmod dates.",
                  "rec": "Publish a sitemap.xml with lastmod dates and reference it in robots.txt."
                },
                {
                  "label": "Social / Open Graph",
                  "status": "partial",
                  "weight": 1,
                  "detail": "3/3 Open Graph tags, no Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 63,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 80,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "partial",
                  "weight": 2,
                  "detail": "A form element is present but has no usable named inputs.",
                  "rec": "Provide real <form> elements with a real action attribute, named inputs and <label>/aria-label, and no honeypot trap, so an agent can read and complete the task. Forms wired only in JavaScript are invisible to non-rendering agents."
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1200 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A contact route (ContactPoint, mailto or tel) is available for an agent to hand off.",
                  "rec": null
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 10,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, Brand or Person entity in structured data.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 10,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "3 extractable signals (statistics, figures, quotations, definitions) a model can lift and attribute.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No machine-readable entity (Organisation / Brand / Person)"
            },
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "Swiss Post",
      "domain": "post.ch",
      "ok": true,
      "finalUrl": "https://www.post.ch/de",
      "offDomain": "post.ch",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 37,
        "execution": 47,
        "representation": 8,
        "composite": 31
      },
      "detail": {
        "retrieval": {
          "score": 37,
          "band": "Significant gaps",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 3,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, LocalBusiness or Person markup found.",
                  "rec": "Declare an Organisation (or LocalBusiness / Person) entity in JSON-LD so AI engines can identify and attribute you by name."
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 0,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No JSON-LD found.",
                  "rec": "Add JSON-LD structured data; it is how a machine reads your facts rather than guessing them."
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 33,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "0 of 3 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": "Write several concise, self-contained paragraphs (roughly 40 to 450 characters, at least eight words each) that each answer a real question, rather than long unbroken blocks or repeated one-liners."
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 H1, 3 H2, 9 H3.",
                  "rec": null
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 70,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "About 81 words of readable text.",
                  "rec": "Give models enough clean, standalone prose to quote. This measures depth, not quality; a focused page can be cited at lower length, but very thin pages rarely are."
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 23 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 134 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 5 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 96,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "pass",
                  "weight": 1,
                  "detail": "3/3 Open Graph tags plus a Twitter card.",
                  "rec": null
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "Thin content (under 250 words)"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 47,
          "band": "Major friction",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 63,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "partial",
                  "weight": 3,
                  "detail": "Some AI agents are refused at the edge while a browser gets 200 (OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 403, GPTBot 200).",
                  "rec": "Your CDN or WAF is refusing AI user-agents at the network layer, so the page is invisible to those agents regardless of robots.txt. If you intend to be agent-reachable, allow the retrieval user-agents (OAI-SearchBot, PerplexityBot, Claude-SearchBot) in your bot-management or Pay-Per-Crawl settings. Note: we test this by sending these user-agent strings from our scanner, so it measures how your edge treats the user-agent; a real agent presents the same string from its own network, making this a strong signal rather than a guarantee."
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 65,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "pass",
                  "weight": 2,
                  "detail": "1 form(s) with named, labelled inputs and a submittable action an agent can complete.",
                  "rec": null
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Very little static content (~81 words); agents that do not run JavaScript will see almost nothing.",
                  "rec": "Server-render or pre-render the primary content and controls. Agents and most crawlers do not execute JavaScript, so a client-rendered action surface is invisible to them."
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "Some AI agents refused at the edge (ClaudeBot)"
            },
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            },
            {
              "sev": "error",
              "label": "Action surface appears client-side rendered; agents may see little"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 8,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, Brand or Person entity in structured data.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 0,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Few extractable, quotable claims; little for a model to cite back to you.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No usage terms found on the page (license, copyrightHolder, meta reservation), and the TDM reservation file (/.well-known/tdmrep.json) could not be read on this scan, so the declared-terms verdict is unmeasured rather than a definitive absence. (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No machine-readable entity (Organisation / Brand / Person)"
            },
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": true
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": [
        "tdmrep-unmeasured"
      ]
    },
    {
      "name": "Poste Italiane",
      "domain": "posteitaliane.it",
      "ok": true,
      "finalUrl": "https://www.posteitaliane.it/",
      "offDomain": "posteitaliane.it",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 42,
        "execution": 62,
        "representation": 13,
        "composite": 39
      },
      "detail": {
        "retrieval": {
          "score": 42,
          "band": "Significant gaps",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 3,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, LocalBusiness or Person markup found.",
                  "rec": "Declare an Organisation (or LocalBusiness / Person) entity in JSON-LD so AI engines can identify and attribute you by name."
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 0,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No JSON-LD found.",
                  "rec": "Add JSON-LD structured data; it is how a machine reads your facts rather than guessing them."
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 67,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "8 of 18 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 H1, 14 H2, 51 H3.",
                  "rec": null
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 80,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1600 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 25 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No meta description found.",
                  "rec": "Add a clear meta description."
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 18 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 72,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "No robots.txt is blocking AI crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No canonical link found.",
                  "rec": "Declare a canonical URL so engines consolidate signals on one address."
                },
                {
                  "label": "Sitemap",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "A sitemap exists but carries no lastmod dates.",
                  "rec": "Publish a sitemap.xml with lastmod dates and reference it in robots.txt."
                },
                {
                  "label": "Social / Open Graph",
                  "status": "partial",
                  "weight": 1,
                  "detail": "3/3 Open Graph tags, no Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "partial",
                  "weight": 0.75,
                  "detail": "HTTPS, no viewport, lang set.",
                  "rec": "Serve over HTTPS, add a responsive viewport meta tag, and set an html lang attribute."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "Missing meta description"
            },
            {
              "sev": "warning",
              "label": "No canonical URL declared"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 62,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No robots.txt is blocking retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 75,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "partial",
                  "weight": 2,
                  "detail": "No HTML form on this page, so an agent cannot complete a form-based task here.",
                  "rec": "Provide real <form> elements with a real action attribute, named inputs and <label>/aria-label, and no honeypot trap, so an agent can read and complete the task. Forms wired only in JavaScript are invisible to non-rendering agents."
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1600 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 13,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, Brand or Person entity in structured data.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 20,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "8 extractable signals (statistics, figures, quotations, definitions) a model can lift and attribute.",
                  "rec": null
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No machine-readable entity (Organisation / Brand / Person)"
            },
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "Correos",
      "domain": "correos.es",
      "ok": false,
      "reason": "UNREADABLE (no content / client-side rendered)",
      "wafVendor": ""
    },
    {
      "name": "La Poste",
      "domain": "laposte.fr",
      "ok": true,
      "finalUrl": "https://www.laposte.fr/",
      "offDomain": "laposte.fr",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 62,
        "execution": 50,
        "representation": 33,
        "composite": 48
      },
      "detail": {
        "retrieval": {
          "score": 62,
          "band": "Partly legible",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 36,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "pass",
                  "weight": 2,
                  "detail": "Entity type declared: Organization.",
                  "rec": null
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Author or person is named, but without credential depth.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 54,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 valid JSON-LD block(s).",
                  "rec": null
                },
                {
                  "label": "Linked entity graph",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "The page references a subject, but the schema is otherwise flat.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "Rich types present: Article.",
                  "rec": null
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 67,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "10 of 26 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 H1, 16 H2, 5 H3.",
                  "rec": null
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 80,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1900 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 55 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 138 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "fail",
                  "weight": 1,
                  "detail": "56% of 50 images have alt text.",
                  "rec": "Give images descriptive alt text; it is readable context a model can use."
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 83,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "A sitemap exists but carries no lastmod dates.",
                  "rec": "Publish a sitemap.xml with lastmod dates and reference it in robots.txt."
                },
                {
                  "label": "Social / Open Graph",
                  "status": "partial",
                  "weight": 1,
                  "detail": "3/3 Open Graph tags, no Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "1 insecure HTTP resource on a secure page"
            },
            {
              "sev": "warning",
              "label": "22 images missing alt text"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 50,
          "band": "Major friction",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 63,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "partial",
                  "weight": 3,
                  "detail": "Could not establish a browser baseline (control returned 403); agent results inconclusive. Probed: OAI-SearchBot 200, PerplexityBot 403, ClaudeBot 403, GPTBot 200.",
                  "rec": "Your CDN or WAF is refusing AI user-agents at the network layer, so the page is invisible to those agents regardless of robots.txt. If you intend to be agent-reachable, allow the retrieval user-agents (OAI-SearchBot, PerplexityBot, Claude-SearchBot) in your bot-management or Pay-Per-Crawl settings. Note: we test this by sending these user-agent strings from our scanner, so it measures how your edge treats the user-agent; a real agent presents the same string from its own network, making this a strong signal rather than a guarantee."
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 75,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "partial",
                  "weight": 2,
                  "detail": "1 form(s) with named inputs, but no action attribute: submission is wired in JavaScript, so a non-rendering agent has no endpoint to post to.",
                  "rec": "Provide real <form> elements with a real action attribute, named inputs and <label>/aria-label, and no honeypot trap, so an agent can read and complete the task. Forms wired only in JavaScript are invisible to non-rendering agents."
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1900 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "Some AI agents refused at the edge (PerplexityBot, ClaudeBot)"
            },
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 33,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 50,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "partial",
                  "weight": 2,
                  "detail": "Entity declared (La Poste), but thin: no description; no knowsAbout / areaServed / founder detail.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Entity name is consistent across surfaces, but no legal identifier (company number, VAT, LEI) is declared.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 40,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "A person or author is named, but without credential depth.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "2 extractable signals (statistics, figures, quotations, definitions) a model can lift and attribute.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": false,
        "consistent": null,
        "note": "browser-ua-unreadable"
      },
      "flags": []
    },
    {
      "name": "Japan Post",
      "domain": "japanpost.jp",
      "ok": false,
      "reason": "UNREACHABLE (no response)",
      "wafVendor": ""
    },
    {
      "name": "Canada Post",
      "domain": "canadapost.ca",
      "ok": false,
      "reason": "UNREADABLE (HTTP 500)",
      "wafVendor": ""
    },
    {
      "name": "Australia Post",
      "domain": "auspost.com.au",
      "ok": true,
      "finalUrl": "https://auspost.com.au/",
      "offDomain": "auspost.com.au",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 47,
        "execution": 62,
        "representation": 10,
        "composite": 40
      },
      "detail": {
        "retrieval": {
          "score": 47,
          "band": "Significant gaps",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 3,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, LocalBusiness or Person markup found.",
                  "rec": "Declare an Organisation (or LocalBusiness / Person) entity in JSON-LD so AI engines can identify and attribute you by name."
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 0,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No JSON-LD found.",
                  "rec": "Add JSON-LD structured data; it is how a machine reads your facts rather than guessing them."
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 67,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "18 of 18 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 H1, 204 H2, 31 H3.",
                  "rec": null
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 80,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 3000 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 48 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 148 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "fail",
                  "weight": 1,
                  "detail": "40% of 25 images have alt text.",
                  "rec": "Give images descriptive alt text; it is readable context a model can use."
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 96,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "pass",
                  "weight": 1,
                  "detail": "3/3 Open Graph tags plus a Twitter card.",
                  "rec": null
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "15 images missing alt text"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 62,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 75,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "partial",
                  "weight": 2,
                  "detail": "No HTML form on this page, so an agent cannot complete a form-based task here.",
                  "rec": "Provide real <form> elements with a real action attribute, named inputs and <label>/aria-label, and no honeypot trap, so an agent can read and complete the task. Forms wired only in JavaScript are invisible to non-rendering agents."
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 3000 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 10,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, Brand or Person entity in structured data.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 10,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "4 extractable signals (statistics, figures, quotations, definitions) a model can lift and attribute.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No machine-readable entity (Organisation / Brand / Person)"
            },
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "Singapore Post",
      "domain": "singpost.com",
      "ok": true,
      "finalUrl": "https://www.singpost.com/",
      "offDomain": "singpost.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 62,
        "execution": 62,
        "representation": 32,
        "composite": 52
      },
      "detail": {
        "retrieval": {
          "score": 62,
          "band": "Partly legible",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 50,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "pass",
                  "weight": 2,
                  "detail": "Entity type declared: Organization.",
                  "rec": null
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "partial",
                  "weight": 2,
                  "detail": "2 distinct external profiles linked via sameAs.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Your entity carries some descriptive depth.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 21,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 valid JSON-LD block(s).",
                  "rec": null
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 67,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "7 of 21 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 H1, 7 H2, 11 H3.",
                  "rec": null
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 85,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "About 408 words of readable text.",
                  "rec": "Give models enough clean, standalone prose to quote. This measures depth, not quality; a focused page can be cited at lower length, but very thin pages rarely are."
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 69 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 144 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "86% of 29 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 96,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "pass",
                  "weight": 1,
                  "detail": "3/3 Open Graph tags plus a Twitter card.",
                  "rec": null
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "4 images missing alt text"
            },
            {
              "sev": "warning",
              "label": "Title likely truncated in results (over 65 characters)"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 62,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 75,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "partial",
                  "weight": 2,
                  "detail": "1 form(s) with named inputs, but no action attribute: submission is wired in JavaScript, so a non-rendering agent has no endpoint to post to.",
                  "rec": "Provide real <form> elements with a real action attribute, named inputs and <label>/aria-label, and no honeypot trap, so an agent can read and complete the task. Forms wired only in JavaScript are invisible to non-rendering agents."
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 408 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 32,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 50,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "partial",
                  "weight": 2,
                  "detail": "Entity declared (SingPost), but thin: no knowsAbout / areaServed / founder detail.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Entity name is consistent across surfaces, but no legal identifier (company number, VAT, LEI) is declared.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 30,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "1 confirmed and 0 unverified authoritative home(s) (of 2 declared; the rest did not resolve): twitter.com.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "Profile links are present, but no CONFIRMED authoritative registry (Wikidata, Companies House, OpenCorporates) anchors them.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 0,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Few extractable, quotable claims; little for a model to cite back to you.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 2,
              "reachable": 2,
              "confirmed": 1,
              "dead": 0,
              "links": [
                {
                  "host": "facebook.com",
                  "status": 200,
                  "state": "reachable"
                },
                {
                  "host": "twitter.com",
                  "status": 200,
                  "state": "confirmed"
                }
              ],
              "scoringHosts": [
                "twitter.com"
              ],
              "confirmedHosts": [
                "twitter.com"
              ],
              "unverifiedHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "SF Express",
      "domain": "sf-express.com",
      "ok": false,
      "reason": "UNREACHABLE (no response)",
      "wafVendor": ""
    },
    {
      "name": "ZTO Express",
      "domain": "zto.com",
      "ok": false,
      "reason": "UNREACHABLE (no response)",
      "wafVendor": ""
    },
    {
      "name": "Whistl",
      "domain": "whistl.co.uk",
      "ok": true,
      "finalUrl": "https://www.whistl.co.uk/",
      "offDomain": "whistl.co.uk",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 63,
        "execution": 69,
        "representation": 44,
        "composite": 59
      },
      "detail": {
        "retrieval": {
          "score": 63,
          "band": "Partly legible",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 58,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "pass",
                  "weight": 2,
                  "detail": "Entity type declared: Organization.",
                  "rec": null
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "partial",
                  "weight": 2,
                  "detail": "1 distinct external profile linked via sameAs.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Logo and contact details in structured data.",
                  "rec": null
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "pass",
                  "weight": 1,
                  "detail": "BreadcrumbList schema present.",
                  "rec": null
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 32,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "2 valid JSON-LD block(s).",
                  "rec": null
                },
                {
                  "label": "Linked entity graph",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Uses @graph / @id, but the page does not reference a subject entity.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 50,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "32 of 44 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "4 H1, 13 H2, 22 H3.",
                  "rec": "Use exactly one H1, then H2/H3 to structure the content a model parses."
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 100,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1600 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 39 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 127 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 13 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 96,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "llms.txt present (5,619 characters); read today by coding and agent tools.",
                  "rec": null
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "A sitemap exists but carries no lastmod dates.",
                  "rec": "Publish a sitemap.xml with lastmod dates and reference it in robots.txt."
                },
                {
                  "label": "Social / Open Graph",
                  "status": "pass",
                  "weight": 1,
                  "detail": "3/3 Open Graph tags plus a Twitter card.",
                  "rec": null
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "Multiple H1 headings (4)"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 69,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 90,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "pass",
                  "weight": 2,
                  "detail": "1 form(s) with named, labelled inputs and a submittable action an agent can complete.",
                  "rec": null
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1600 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A contact route (ContactPoint, mailto or tel) is available for an agent to hand off.",
                  "rec": null
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "partial",
                  "weight": 1,
                  "detail": "An invisible reCAPTCHA v3 is present; it scores requests rather than blocking outright, but can still gate an action on a low score.",
                  "rec": "Do not gate primary actions behind an interactive CAPTCHA (hCaptcha, Turnstile, reCAPTCHA v2), which agents cannot solve. Invisible scoring (reCAPTCHA v3) is less hostile but can still block a low-scoring agent, so keep it off critical task paths."
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 100,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "llms.txt declares transactional or API surfaces for agents.",
                  "rec": null
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 44,
          "band": "Ambiguous identity",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 50,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "partial",
                  "weight": 2,
                  "detail": "Entity declared (Whistl), but thin: no description; no knowsAbout / areaServed / founder detail.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Entity name is consistent across surfaces, but no legal identifier (company number, VAT, LEI) is declared.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 30,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "1 confirmed and 0 unverified authoritative home(s): linkedin.com.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "Profile links are present, but no CONFIRMED authoritative registry (Wikidata, Companies House, OpenCorporates) anchors them.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 20,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "6 extractable signals (statistics, figures, quotations, definitions) a model can lift and attribute.",
                  "rec": null
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 100,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "pass",
                  "weight": 1,
                  "detail": "You actively govern representation: TDM reservation. (no training opt-out declared.)",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 1,
              "reachable": 1,
              "confirmed": 1,
              "dead": 0,
              "links": [
                {
                  "host": "linkedin.com",
                  "status": 200,
                  "state": "confirmed"
                }
              ],
              "scoringHosts": [
                "linkedin.com"
              ],
              "confirmedHosts": [
                "linkedin.com"
              ],
              "unverifiedHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "CitySprint",
      "domain": "citysprint.co.uk",
      "ok": true,
      "finalUrl": "https://www.citysprint.co.uk/",
      "offDomain": "citysprint.co.uk",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 39,
        "execution": 62,
        "representation": 8,
        "composite": 36
      },
      "detail": {
        "retrieval": {
          "score": 39,
          "band": "Significant gaps",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 3,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, LocalBusiness or Person markup found.",
                  "rec": "Declare an Organisation (or LocalBusiness / Person) entity in JSON-LD so AI engines can identify and attribute you by name."
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 0,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No JSON-LD found.",
                  "rec": "Add JSON-LD structured data; it is how a machine reads your facts rather than guessing them."
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 33,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "32 of 39 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "0 H1, 14 H2, 18 H3.",
                  "rec": "Use exactly one H1, then H2/H3 to structure the content a model parses."
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 100,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 992 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 67 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 155 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 25 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 87,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "partial",
                  "weight": 1,
                  "detail": "2/3 Open Graph tags plus a Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No H1 heading on the page"
            },
            {
              "sev": "error",
              "label": "2 insecure HTTP resources on a secure page"
            },
            {
              "sev": "warning",
              "label": "Title likely truncated in results (over 65 characters)"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 62,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 75,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "partial",
                  "weight": 2,
                  "detail": "No HTML form on this page, so an agent cannot complete a form-based task here.",
                  "rec": "Provide real <form> elements with a real action attribute, named inputs and <label>/aria-label, and no honeypot trap, so an agent can read and complete the task. Forms wired only in JavaScript are invisible to non-rendering agents."
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 992 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 8,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, Brand or Person entity in structured data.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 0,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Few extractable, quotable claims; little for a model to cite back to you.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No machine-readable entity (Organisation / Brand / Person)"
            },
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "Posten Bring",
      "domain": "bring.com",
      "ok": true,
      "finalUrl": "https://www.bring.com/",
      "offDomain": "bring.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 45,
        "execution": 62,
        "representation": 8,
        "composite": 38
      },
      "detail": {
        "retrieval": {
          "score": 45,
          "band": "Significant gaps",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 3,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, LocalBusiness or Person markup found.",
                  "rec": "Declare an Organisation (or LocalBusiness / Person) entity in JSON-LD so AI engines can identify and attribute you by name."
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 11,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "1 JSON-LD block(s), but 1 failed to parse.",
                  "rec": "Fix the malformed JSON-LD; invalid blocks are ignored or distrusted."
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 67,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "4 of 8 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": "Write several concise, self-contained paragraphs (roughly 40 to 450 characters, at least eight words each) that each answer a real question, rather than long unbroken blocks or repeated one-liners."
                },
                {
                  "label": "Question-led content",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "1 question-led heading(s) or Q&A found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 H1, 8 H2, 5 H3.",
                  "rec": null
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 65,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "About 342 words of readable text.",
                  "rec": "Give models enough clean, standalone prose to quote. This measures depth, not quality; a focused page can be cited at lower length, but very thin pages rarely are."
                },
                {
                  "label": "Title quality",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Title is 9 characters.",
                  "rec": "Aim for a 15 to 70 character title that states who you are and what you do."
                },
                {
                  "label": "Meta description quality",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Meta description is 9 characters.",
                  "rec": "Aim for a 70 to 180 character description; it is often quoted verbatim as your summary."
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 3 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 83,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No canonical link found.",
                  "rec": "Declare a canonical URL so engines consolidate signals on one address."
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "partial",
                  "weight": 1,
                  "detail": "2/3 Open Graph tags, no Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "1 invalid structured-data block"
            },
            {
              "sev": "warning",
              "label": "No canonical URL declared"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 62,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 75,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "partial",
                  "weight": 2,
                  "detail": "A form element is present but has no usable named inputs.",
                  "rec": "Provide real <form> elements with a real action attribute, named inputs and <label>/aria-label, and no honeypot trap, so an agent can read and complete the task. Forms wired only in JavaScript are invisible to non-rendering agents."
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 342 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 8,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, Brand or Person entity in structured data.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 0,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Few extractable, quotable claims; little for a model to cite back to you.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No machine-readable entity (Organisation / Brand / Person)"
            },
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "Kuehne + Nagel",
      "domain": "kuehne-nagel.com",
      "ok": true,
      "finalUrl": "https://www.kuehne-nagel.com/",
      "offDomain": "kuehne-nagel.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 67,
        "execution": 62,
        "representation": 41,
        "composite": 57
      },
      "detail": {
        "retrieval": {
          "score": 67,
          "band": "Partly legible",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 53,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "pass",
                  "weight": 2,
                  "detail": "Entity type declared: Organization.",
                  "rec": null
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "pass",
                  "weight": 2,
                  "detail": "4 distinct external profiles linked via sameAs.",
                  "rec": null
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 21,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 valid JSON-LD block(s).",
                  "rec": null
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 83,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "12 of 41 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "1 question-led heading(s) or Q&A found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 H1, 7 H2, 4 H3.",
                  "rec": null
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 100,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 979 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 68 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 122 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 3 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 87,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "AI answer crawlers allowed; training or user-initiated crawlers blocked (bytespider), a legitimate choice.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "partial",
                  "weight": 1,
                  "detail": "3/3 Open Graph tags, no Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "Title likely truncated in results (over 65 characters)"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 62,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 75,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "partial",
                  "weight": 2,
                  "detail": "No HTML form on this page, so an agent cannot complete a form-based task here.",
                  "rec": "Provide real <form> elements with a real action attribute, named inputs and <label>/aria-label, and no honeypot trap, so an agent can read and complete the task. Forms wired only in JavaScript are invisible to non-rendering agents."
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 979 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 41,
          "band": "Ambiguous identity",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 50,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "partial",
                  "weight": 2,
                  "detail": "Entity declared (Kuehne+Nagel), but thin: no description; no knowsAbout / areaServed / founder detail.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Entity name is consistent across surfaces, but no legal identifier (company number, VAT, LEI) is declared.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 60,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "2 confirmed and 0 unverified authoritative home(s) (of 4 declared; the rest did not resolve): twitter.com, linkedin.com.",
                  "rec": null
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "Profile links are present, but no CONFIRMED authoritative registry (Wikidata, Companies House, OpenCorporates) anchors them.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 0,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Few extractable, quotable claims; little for a model to cite back to you.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (training/other crawlers blocked (bytespider).)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 4,
              "reachable": 4,
              "confirmed": 2,
              "dead": 0,
              "links": [
                {
                  "host": "facebook.com",
                  "status": 200,
                  "state": "reachable"
                },
                {
                  "host": "twitter.com",
                  "status": 200,
                  "state": "confirmed"
                },
                {
                  "host": "youtube.com",
                  "status": 200,
                  "state": "reachable"
                },
                {
                  "host": "linkedin.com",
                  "status": 200,
                  "state": "confirmed"
                }
              ],
              "scoringHosts": [
                "twitter.com",
                "linkedin.com"
              ],
              "confirmedHosts": [
                "twitter.com",
                "linkedin.com"
              ],
              "unverifiedHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "DSV",
      "domain": "dsv.com",
      "ok": true,
      "finalUrl": "https://www.dsv.com/en",
      "offDomain": "dsv.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 52,
        "execution": 68,
        "representation": 10,
        "composite": 43
      },
      "detail": {
        "retrieval": {
          "score": 52,
          "band": "Significant gaps",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 3,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, LocalBusiness or Person markup found.",
                  "rec": "Declare an Organisation (or LocalBusiness / Person) entity in JSON-LD so AI engines can identify and attribute you by name."
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 7,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No JSON-LD found.",
                  "rec": "Add JSON-LD structured data; it is how a machine reads your facts rather than guessing them."
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Dates present in meta or <time> tags, but not in structured data.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 100,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "47 of 207 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "2 question-led heading(s) or Q&A found.",
                  "rec": null
                },
                {
                  "label": "Heading structure",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 H1, 25 H2, 41 H3.",
                  "rec": null
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 80,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 2200 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 36 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No meta description found.",
                  "rec": "Add a clear meta description."
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 37 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 74,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No canonical link found.",
                  "rec": "Declare a canonical URL so engines consolidate signals on one address."
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "fail",
                  "weight": 1,
                  "detail": "0/3 Open Graph tags, no Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "Missing meta description"
            },
            {
              "sev": "warning",
              "label": "No canonical URL declared"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 68,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 95,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "pass",
                  "weight": 2,
                  "detail": "7 form(s) with named, labelled inputs and a submittable action an agent can complete.",
                  "rec": null
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 2200 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 10,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, Brand or Person entity in structured data.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 10,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "2 extractable signals (statistics, figures, quotations, definitions) a model can lift and attribute.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No machine-readable entity (Organisation / Brand / Person)"
            },
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "DB Schenker",
      "domain": "dbschenker.com",
      "ok": true,
      "finalUrl": "https://www.dsv.com/en",
      "offDomain": "dsv.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 52,
        "execution": 68,
        "representation": 10,
        "composite": 43
      },
      "detail": {
        "retrieval": {
          "score": 52,
          "band": "Significant gaps",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 3,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, LocalBusiness or Person markup found.",
                  "rec": "Declare an Organisation (or LocalBusiness / Person) entity in JSON-LD so AI engines can identify and attribute you by name."
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 7,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No JSON-LD found.",
                  "rec": "Add JSON-LD structured data; it is how a machine reads your facts rather than guessing them."
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Dates present in meta or <time> tags, but not in structured data.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 100,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "47 of 207 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "2 question-led heading(s) or Q&A found.",
                  "rec": null
                },
                {
                  "label": "Heading structure",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 H1, 25 H2, 41 H3.",
                  "rec": null
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 80,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 2200 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 36 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No meta description found.",
                  "rec": "Add a clear meta description."
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 37 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 74,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No canonical link found.",
                  "rec": "Declare a canonical URL so engines consolidate signals on one address."
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "fail",
                  "weight": 1,
                  "detail": "0/3 Open Graph tags, no Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "Missing meta description"
            },
            {
              "sev": "warning",
              "label": "No canonical URL declared"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 68,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 95,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "pass",
                  "weight": 2,
                  "detail": "7 form(s) with named, labelled inputs and a submittable action an agent can complete.",
                  "rec": null
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 2200 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 10,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, Brand or Person entity in structured data.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 10,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "2 extractable signals (statistics, figures, quotations, definitions) a model can lift and attribute.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No machine-readable entity (Organisation / Brand / Person)"
            },
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "Expeditors International",
      "domain": "expeditors.com",
      "ok": true,
      "finalUrl": "https://www.expeditors.com/",
      "offDomain": "expeditors.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 38,
        "execution": 30,
        "representation": 8,
        "composite": 25
      },
      "detail": {
        "retrieval": {
          "score": 38,
          "band": "Significant gaps",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 3,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, LocalBusiness or Person markup found.",
                  "rec": "Declare an Organisation (or LocalBusiness / Person) entity in JSON-LD so AI engines can identify and attribute you by name."
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 0,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No JSON-LD found.",
                  "rec": "Add JSON-LD structured data; it is how a machine reads your facts rather than guessing them."
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 33,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "21 of 27 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "2 H1, 0 H2, 0 H3.",
                  "rec": "Use exactly one H1, then H2/H3 to structure the content a model parses."
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 100,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 748 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 17 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 168 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "93% of 14 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 83,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "AI answer crawlers allowed; training or user-initiated crawlers blocked (gptbot, claudebot, google-extended, applebot-extended, meta-externalagent, ccbot, bytespider), a legitimate choice.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "A sitemap is referenced but its file could not be read on this scan, so its lastmod freshness is unmeasured.",
                  "rec": "Publish a sitemap.xml with lastmod dates and reference it in robots.txt."
                },
                {
                  "label": "Social / Open Graph",
                  "status": "partial",
                  "weight": 1,
                  "detail": "3/3 Open Graph tags, no Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "Multiple H1 headings (2)"
            },
            {
              "sev": "warning",
              "label": "1 image missing alt text"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 30,
          "band": "Closed to agents",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 25,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "fail",
                  "weight": 3,
                  "detail": "Every probed AI agent is refused at the edge while a browser gets 200 (OAI-SearchBot 403, PerplexityBot 403, ClaudeBot 403, GPTBot 403).",
                  "rec": "Your CDN or WAF is refusing AI user-agents at the network layer, so the page is invisible to those agents regardless of robots.txt. If you intend to be agent-reachable, allow the retrieval user-agents (OAI-SearchBot, PerplexityBot, Claude-SearchBot) in your bot-management or Pay-Per-Crawl settings. Note: we test this by sending these user-agent strings from our scanner, so it measures how your edge treats the user-agent; a real agent presents the same string from its own network, making this a strong signal rather than a guarantee."
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 75,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "partial",
                  "weight": 2,
                  "detail": "No HTML form on this page, so an agent cannot complete a form-based task here.",
                  "rec": "Provide real <form> elements with a real action attribute, named inputs and <label>/aria-label, and no honeypot trap, so an agent can read and complete the task. Forms wired only in JavaScript are invisible to non-rendering agents."
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 748 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "AI agents are refused at the edge (CDN/WAF), not just in robots.txt"
            },
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 8,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, Brand or Person entity in structured data.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 0,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Few extractable, quotable claims; little for a model to cite back to you.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (training/other crawlers blocked (gptbot, claudebot, google-extended, applebot-extended).)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No machine-readable entity (Organisation / Brand / Person)"
            },
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "C.H. Robinson",
      "domain": "chrobinson.com",
      "ok": true,
      "finalUrl": "https://www.chrobinson.com/en-us/",
      "offDomain": "chrobinson.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 67,
        "execution": 78,
        "representation": 43,
        "composite": 63
      },
      "detail": {
        "retrieval": {
          "score": 67,
          "band": "Partly legible",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 67,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "pass",
                  "weight": 2,
                  "detail": "Entity type declared: Organization.",
                  "rec": null
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "pass",
                  "weight": 2,
                  "detail": "4 distinct external profiles linked via sameAs.",
                  "rec": null
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Logo and contact details in structured data.",
                  "rec": null
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Your entity carries some descriptive depth.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 32,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "3 valid JSON-LD block(s).",
                  "rec": null
                },
                {
                  "label": "Linked entity graph",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Uses @graph / @id, but the page does not reference a subject entity.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 83,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "15 of 27 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "1 question-led heading(s) or Q&A found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 H1, 11 H2, 12 H3.",
                  "rec": null
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 100,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 881 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 69 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 155 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "97% of 32 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 61,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "llms.txt present (199,996 characters); read today by coding and agent tools.",
                  "rec": null
                },
                {
                  "label": "AI crawler access",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "robots.txt blocks AI answer crawlers: claude-searchbot.",
                  "rec": "Allow the crawlers that surface you in AI answers (OAI-SearchBot for ChatGPT search, PerplexityBot, Claude-SearchBot), or you are opting out of much AI visibility. Blocking training crawlers (GPTBot, ClaudeBot, Google-Extended) is a separate, legitimate choice that does not affect being cited in AI answers."
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "A sitemap exists but carries no lastmod dates.",
                  "rec": "Publish a sitemap.xml with lastmod dates and reference it in robots.txt."
                },
                {
                  "label": "Social / Open Graph",
                  "status": "partial",
                  "weight": 1,
                  "detail": "3/3 Open Graph tags, no Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "1 insecure HTTP resource on a secure page"
            },
            {
              "sev": "warning",
              "label": "1 image missing alt text"
            },
            {
              "sev": "warning",
              "label": "Title likely truncated in results (over 65 characters)"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 78,
          "band": "Agent-operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 75,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "fail",
                  "weight": 1,
                  "detail": "robots.txt disallows retrieval agents: claude-searchbot.",
                  "rec": "Allow the retrieval crawlers that feed AI answers (OAI-SearchBot, PerplexityBot, Claude-SearchBot) in robots.txt. Blocking training crawlers is a separate, legitimate choice."
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 71,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "pass",
                  "weight": 2.5,
                  "detail": "A consequential action is described in schema.",
                  "rec": null
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 80,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "partial",
                  "weight": 2,
                  "detail": "No HTML form on this page, so an agent cannot complete a form-based task here.",
                  "rec": "Provide real <form> elements with a real action attribute, named inputs and <label>/aria-label, and no honeypot trap, so an agent can read and complete the task. Forms wired only in JavaScript are invisible to non-rendering agents."
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 881 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A contact route (ContactPoint, mailto or tel) is available for an agent to hand off.",
                  "rec": null
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 100,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "llms.txt declares transactional or API surfaces for agents.",
                  "rec": null
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "robots.txt disallows retrieval agents"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 43,
          "band": "Ambiguous identity",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 50,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "partial",
                  "weight": 2,
                  "detail": "Entity declared (C.H. Robinson), but thin: no knowsAbout / areaServed / founder detail.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Entity name is consistent across surfaces, but no legal identifier (company number, VAT, LEI) is declared.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 60,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "2 confirmed and 0 unverified authoritative home(s) (of 4 declared; the rest did not resolve): twitter.com, linkedin.com.",
                  "rec": null
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "Profile links are present, but no CONFIRMED authoritative registry (Wikidata, Companies House, OpenCorporates) anchors them.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 10,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "5 extractable signals (statistics, figures, quotations, definitions) a model can lift and attribute.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (training/other crawlers blocked (google-extended, imagesiftbot, claude-user, oai-adsbot).)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 4,
              "reachable": 4,
              "confirmed": 2,
              "dead": 0,
              "links": [
                {
                  "host": "facebook.com",
                  "status": 200,
                  "state": "reachable"
                },
                {
                  "host": "twitter.com",
                  "status": 200,
                  "state": "confirmed"
                },
                {
                  "host": "youtube.com",
                  "status": 200,
                  "state": "reachable"
                },
                {
                  "host": "linkedin.com",
                  "status": 200,
                  "state": "confirmed"
                }
              ],
              "scoringHosts": [
                "twitter.com",
                "linkedin.com"
              ],
              "confirmedHosts": [
                "twitter.com",
                "linkedin.com"
              ],
              "unverifiedHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "XPO",
      "domain": "xpo.com",
      "ok": true,
      "finalUrl": "https://www.xpo.com/",
      "offDomain": "xpo.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 62,
        "execution": 73,
        "representation": 32,
        "composite": 56
      },
      "detail": {
        "retrieval": {
          "score": 62,
          "band": "Partly legible",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 67,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "pass",
                  "weight": 2,
                  "detail": "Entity type declared: Corporation, Organization.",
                  "rec": null
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "pass",
                  "weight": 2,
                  "detail": "4 distinct external profiles linked via sameAs.",
                  "rec": null
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Logo and contact details in structured data.",
                  "rec": null
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Your entity carries some descriptive depth.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 43,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 valid JSON-LD block(s).",
                  "rec": null
                },
                {
                  "label": "Linked entity graph",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "Entities are linked with @graph / @id, and the page references its subject.",
                  "rec": null
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 50,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "3 of 17 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": "Write several concise, self-contained paragraphs (roughly 40 to 450 characters, at least eight words each) that each answer a real question, rather than long unbroken blocks or repeated one-liners."
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 H1, 2 H2, 2 H3.",
                  "rec": null
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 70,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "About 115 words of readable text.",
                  "rec": "Give models enough clean, standalone prose to quote. This measures depth, not quality; a focused page can be cited at lower length, but very thin pages rarely are."
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 47 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 168 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 3 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 87,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "partial",
                  "weight": 1,
                  "detail": "3/3 Open Graph tags, no Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "Thin content (under 250 words)"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 73,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 71,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "pass",
                  "weight": 2.5,
                  "detail": "A consequential action is described in schema.",
                  "rec": null
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 45,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "partial",
                  "weight": 2,
                  "detail": "No HTML form on this page, so an agent cannot complete a form-based task here.",
                  "rec": "Provide real <form> elements with a real action attribute, named inputs and <label>/aria-label, and no honeypot trap, so an agent can read and complete the task. Forms wired only in JavaScript are invisible to non-rendering agents."
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Very little static content (~115 words); agents that do not run JavaScript will see almost nothing.",
                  "rec": "Server-render or pre-render the primary content and controls. Agents and most crawlers do not execute JavaScript, so a client-rendered action surface is invisible to them."
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "Action surface appears client-side rendered; agents may see little"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 32,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 50,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "partial",
                  "weight": 2,
                  "detail": "Entity declared (XPO), but thin: no description.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Entity name is consistent across surfaces, but no legal identifier (company number, VAT, LEI) is declared.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 30,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "1 confirmed and 0 unverified authoritative home(s) (of 4 declared; the rest did not resolve): twitter.com.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "Profile links are present, but no CONFIRMED authoritative registry (Wikidata, Companies House, OpenCorporates) anchors them.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 0,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Few extractable, quotable claims; little for a model to cite back to you.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 4,
              "reachable": 4,
              "confirmed": 1,
              "dead": 0,
              "links": [
                {
                  "host": "facebook.com",
                  "status": 200,
                  "state": "reachable"
                },
                {
                  "host": "twitter.com",
                  "status": 200,
                  "state": "confirmed"
                },
                {
                  "host": "youtube.com",
                  "status": 200,
                  "state": "reachable"
                },
                {
                  "host": "linkedin.com",
                  "status": 200,
                  "state": "reachable"
                }
              ],
              "scoringHosts": [
                "twitter.com"
              ],
              "confirmedHosts": [
                "twitter.com"
              ],
              "unverifiedHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "GXO Logistics",
      "domain": "gxo.com",
      "ok": true,
      "finalUrl": "https://gxo.com/",
      "offDomain": "gxo.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 74,
        "execution": 85,
        "representation": 34,
        "composite": 64
      },
      "detail": {
        "retrieval": {
          "score": 74,
          "band": "Partly legible",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 42,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "pass",
                  "weight": 2,
                  "detail": "Entity type declared: Organization.",
                  "rec": null
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "partial",
                  "weight": 2,
                  "detail": "2 distinct external profiles linked via sameAs.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 79,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 valid JSON-LD block(s).",
                  "rec": null
                },
                {
                  "label": "Linked entity graph",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "Entities are linked with @graph / @id, and the page references its subject.",
                  "rec": null
                },
                {
                  "label": "Rich content types",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "Rich types present: Article, Videoobject.",
                  "rec": null
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "pass",
                  "weight": 1,
                  "detail": "datePublished / dateModified present in structured data.",
                  "rec": null
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 67,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "19 of 36 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 H1, 20 H2, 6 H3.",
                  "rec": null
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 100,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1200 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 15 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 158 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 42 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 96,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "pass",
                  "weight": 1,
                  "detail": "3/3 Open Graph tags plus a Twitter card.",
                  "rec": null
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 85,
          "band": "Agent-operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 71,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "pass",
                  "weight": 2.5,
                  "detail": "A consequential action is described in schema.",
                  "rec": null
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 85,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "pass",
                  "weight": 2,
                  "detail": "2 form(s) with named, labelled inputs and a submittable action an agent can complete.",
                  "rec": null
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1200 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "partial",
                  "weight": 1,
                  "detail": "An invisible reCAPTCHA v3 is present; it scores requests rather than blocking outright, but can still gate an action on a low score.",
                  "rec": "Do not gate primary actions behind an interactive CAPTCHA (hCaptcha, Turnstile, reCAPTCHA v2), which agents cannot solve. Invisible scoring (reCAPTCHA v3) is less hostile but can still block a low-scoring agent, so keep it off critical task paths."
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 34,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 50,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "partial",
                  "weight": 2,
                  "detail": "Entity declared (GXO Logistics), but thin: no description; no knowsAbout / areaServed / founder detail.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Entity name is consistent across surfaces, but no legal identifier (company number, VAT, LEI) is declared.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 30,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "1 confirmed and 0 unverified authoritative home(s) (of 2 declared; the rest did not resolve): twitter.com.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "Profile links are present, but no CONFIRMED authoritative registry (Wikidata, Companies House, OpenCorporates) anchors them.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 10,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "3 extractable signals (statistics, figures, quotations, definitions) a model can lift and attribute.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No usage terms found on the page (license, copyrightHolder, meta reservation), and the TDM reservation file (/.well-known/tdmrep.json) could not be read on this scan, so the declared-terms verdict is unmeasured rather than a definitive absence. (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 2,
              "reachable": 2,
              "confirmed": 1,
              "dead": 0,
              "links": [
                {
                  "host": "facebook.com",
                  "status": 200,
                  "state": "reachable"
                },
                {
                  "host": "twitter.com",
                  "status": 200,
                  "state": "confirmed"
                }
              ],
              "scoringHosts": [
                "twitter.com"
              ],
              "confirmedHosts": [
                "twitter.com"
              ],
              "unverifiedHosts": []
            }
          },
          "tdmUnmeasured": true
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": [
        "tdmrep-unmeasured"
      ]
    },
    {
      "name": "RXO",
      "domain": "rxo.com",
      "ok": true,
      "finalUrl": "https://rxo.com/",
      "offDomain": "rxo.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 73,
        "execution": 87,
        "representation": 34,
        "composite": 65
      },
      "detail": {
        "retrieval": {
          "score": 73,
          "band": "Partly legible",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 42,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "pass",
                  "weight": 2,
                  "detail": "Entity type declared: Organization.",
                  "rec": null
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "partial",
                  "weight": 2,
                  "detail": "2 distinct external profiles linked via sameAs.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 79,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 valid JSON-LD block(s).",
                  "rec": null
                },
                {
                  "label": "Linked entity graph",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "Entities are linked with @graph / @id, and the page references its subject.",
                  "rec": null
                },
                {
                  "label": "Rich content types",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "Rich types present: Article.",
                  "rec": null
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "pass",
                  "weight": 1,
                  "detail": "datePublished / dateModified present in structured data.",
                  "rec": null
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 67,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "14 of 22 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 H1, 10 H2, 7 H3.",
                  "rec": null
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 100,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 987 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 48 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 148 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 19 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 91,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "A sitemap exists but carries no lastmod dates.",
                  "rec": "Publish a sitemap.xml with lastmod dates and reference it in robots.txt."
                },
                {
                  "label": "Social / Open Graph",
                  "status": "pass",
                  "weight": 1,
                  "detail": "3/3 Open Graph tags plus a Twitter card.",
                  "rec": null
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 87,
          "band": "Agent-operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 71,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "pass",
                  "weight": 2.5,
                  "detail": "A consequential action is described in schema.",
                  "rec": null
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 95,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "pass",
                  "weight": 2,
                  "detail": "1 form(s) with named, labelled inputs and a submittable action an agent can complete.",
                  "rec": null
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 987 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 34,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 50,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "partial",
                  "weight": 2,
                  "detail": "Entity declared (RXO), but thin: no description; no knowsAbout / areaServed / founder detail.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Entity name is consistent across surfaces, but no legal identifier (company number, VAT, LEI) is declared.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 30,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "1 confirmed and 0 unverified authoritative home(s) (of 2 declared; the rest did not resolve): twitter.com.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "Profile links are present, but no CONFIRMED authoritative registry (Wikidata, Companies House, OpenCorporates) anchors them.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 10,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "2 extractable signals (statistics, figures, quotations, definitions) a model can lift and attribute.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 2,
              "reachable": 2,
              "confirmed": 1,
              "dead": 0,
              "links": [
                {
                  "host": "facebook.com",
                  "status": 200,
                  "state": "reachable"
                },
                {
                  "host": "twitter.com",
                  "status": 200,
                  "state": "confirmed"
                }
              ],
              "scoringHosts": [
                "twitter.com"
              ],
              "confirmedHosts": [
                "twitter.com"
              ],
              "unverifiedHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "Nippon Express",
      "domain": "nipponexpress.com",
      "ok": false,
      "reason": "UNREACHABLE (no response)",
      "wafVendor": ""
    },
    {
      "name": "CEVA Logistics",
      "domain": "cevalogistics.com",
      "ok": false,
      "reason": "BLOCKED (HTTP 403)",
      "wafVendor": "Cloudflare"
    },
    {
      "name": "DACHSER",
      "domain": "dachser.com",
      "ok": true,
      "finalUrl": "https://www.dachser.com/en/",
      "offDomain": "dachser.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 48,
        "execution": 68,
        "representation": 13,
        "composite": 43
      },
      "detail": {
        "retrieval": {
          "score": 48,
          "band": "Significant gaps",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 3,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, LocalBusiness or Person markup found.",
                  "rec": "Declare an Organisation (or LocalBusiness / Person) entity in JSON-LD so AI engines can identify and attribute you by name."
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 57,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 valid JSON-LD block(s).",
                  "rec": null
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "Rich types present: Article.",
                  "rec": null
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "pass",
                  "weight": 1,
                  "detail": "datePublished / dateModified present in structured data.",
                  "rec": null
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 50,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "23 of 26 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "4 H1, 5 H2, 3 H3.",
                  "rec": "Use exactly one H1, then H2/H3 to structure the content a model parses."
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 50,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1200 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Title is 4 characters.",
                  "rec": "Aim for a 15 to 70 character title that states who you are and what you do."
                },
                {
                  "label": "Meta description quality",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No meta description found.",
                  "rec": "Add a clear meta description."
                },
                {
                  "label": "Image alt coverage",
                  "status": "fail",
                  "weight": 1,
                  "detail": "31% of 16 images have alt text.",
                  "rec": "Give images descriptive alt text; it is readable context a model can use."
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 83,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "A sitemap exists but carries no lastmod dates.",
                  "rec": "Publish a sitemap.xml with lastmod dates and reference it in robots.txt."
                },
                {
                  "label": "Social / Open Graph",
                  "status": "partial",
                  "weight": 1,
                  "detail": "2/3 Open Graph tags, no Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "Multiple H1 headings (4)"
            },
            {
              "sev": "error",
              "label": "75 insecure HTTP resources on a secure page"
            },
            {
              "sev": "warning",
              "label": "11 images missing alt text"
            },
            {
              "sev": "warning",
              "label": "Missing meta description"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 68,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 95,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "pass",
                  "weight": 2,
                  "detail": "2 form(s) with named, labelled inputs and a submittable action an agent can complete.",
                  "rec": null
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1200 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 13,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, Brand or Person entity in structured data.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 20,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "7 extractable signals (statistics, figures, quotations, definitions) a model can lift and attribute.",
                  "rec": null
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No machine-readable entity (Organisation / Brand / Person)"
            },
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "Hellmann Worldwide Logistics",
      "domain": "hellmann.com",
      "ok": false,
      "reason": "UNREACHABLE (no response)",
      "wafVendor": ""
    },
    {
      "name": "Rhenus Logistics",
      "domain": "rhenus.group",
      "ok": true,
      "finalUrl": "https://www.rhenus.group/",
      "offDomain": "rhenus.group",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 80,
        "execution": 87,
        "representation": 23,
        "composite": 63
      },
      "detail": {
        "retrieval": {
          "score": 80,
          "band": "Well positioned",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 69,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "pass",
                  "weight": 2,
                  "detail": "Entity type declared: Organization.",
                  "rec": null
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "pass",
                  "weight": 2,
                  "detail": "3 distinct external profiles linked via sameAs.",
                  "rec": null
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Logo and contact details in structured data.",
                  "rec": null
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "pass",
                  "weight": 1,
                  "detail": "BreadcrumbList schema present.",
                  "rec": null
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 93,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "2 valid JSON-LD block(s).",
                  "rec": null
                },
                {
                  "label": "Linked entity graph",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "Entities are linked with @graph / @id, and the page references its subject.",
                  "rec": null
                },
                {
                  "label": "Rich content types",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "Rich types present: Service.",
                  "rec": null
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Dates present in meta or <time> tags, but not in structured data.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "Products or services are described in structured data.",
                  "rec": null
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 67,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "45 of 74 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 H1, 5 H2, 20 H3.",
                  "rec": null
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 100,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 3200 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 65 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 135 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 53 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 83,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "llms.txt present (2,300 characters); read today by coding and agent tools.",
                  "rec": null
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "fail",
                  "weight": 1,
                  "detail": "1/3 Open Graph tags plus a Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 87,
          "band": "Agent-operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 64,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "partial",
                  "weight": 2.5,
                  "detail": "Offerings are described, but with no price or actionable Action type an agent cannot act on them.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Products or services are described in structured data.",
                  "rec": null
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 100,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "pass",
                  "weight": 2,
                  "detail": "2 form(s) with named, labelled inputs and a submittable action an agent can complete.",
                  "rec": null
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 3200 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A contact route (ContactPoint, mailto or tel) is available for an agent to hand off.",
                  "rec": null
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "llms.txt present but declares no transactional surfaces.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "Offerings described but not actionable (no price or Action)"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 23,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 50,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "partial",
                  "weight": 2,
                  "detail": "Entity declared (Global logistics service provider for holistic solutions | Rhenus), but thin: no description; no knowsAbout / areaServed / founder detail.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Entity name is consistent across surfaces, but no legal identifier (company number, VAT, LEI) is declared.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "2 authoritative link(s) declared, but none resolved; dead links are not counted.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 0,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Few extractable, quotable claims; little for a model to cite back to you.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 2,
              "reachable": 1,
              "confirmed": 0,
              "dead": 1,
              "links": [
                {
                  "host": "linkedin.com",
                  "status": 404,
                  "state": "dead"
                },
                {
                  "host": "instagram.com",
                  "status": 200,
                  "state": "reachable"
                }
              ],
              "scoringHosts": [],
              "confirmedHosts": [],
              "unverifiedHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": [
        "sameas-unverified"
      ]
    },
    {
      "name": "Agility",
      "domain": "agility.com",
      "ok": true,
      "finalUrl": "https://agility.com/",
      "offDomain": "agility.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 77,
        "execution": 89,
        "representation": 52,
        "composite": 73
      },
      "detail": {
        "retrieval": {
          "score": 77,
          "band": "Well positioned",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 86,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "pass",
                  "weight": 2,
                  "detail": "Entity type declared: Organization, Corporation.",
                  "rec": null
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "pass",
                  "weight": 2,
                  "detail": "9 distinct external profiles linked via sameAs.",
                  "rec": null
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Logo and contact details in structured data.",
                  "rec": null
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "pass",
                  "weight": 1,
                  "detail": "BreadcrumbList schema present.",
                  "rec": null
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "Your entity carries some descriptive depth.",
                  "rec": null
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 57,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 valid JSON-LD block(s).",
                  "rec": null
                },
                {
                  "label": "Linked entity graph",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "Entities are linked with @graph / @id, and the page references its subject.",
                  "rec": null
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "pass",
                  "weight": 1,
                  "detail": "datePublished / dateModified present in structured data.",
                  "rec": null
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 67,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "5 of 6 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 H1, 5 H2, 8 H3.",
                  "rec": null
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 90,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 758 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 70 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Meta description is 187 characters.",
                  "rec": "Aim for a 70 to 180 character description; it is often quoted verbatim as your summary."
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 25 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 91,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "A sitemap exists but carries no lastmod dates.",
                  "rec": "Publish a sitemap.xml with lastmod dates and reference it in robots.txt."
                },
                {
                  "label": "Social / Open Graph",
                  "status": "pass",
                  "weight": 1,
                  "detail": "3/3 Open Graph tags plus a Twitter card.",
                  "rec": null
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "Title likely truncated in results (over 65 characters)"
            },
            {
              "sev": "warning",
              "label": "Meta description over 180 characters"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 89,
          "band": "Agent-operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 71,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "pass",
                  "weight": 2.5,
                  "detail": "A consequential action is described in schema.",
                  "rec": null
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 100,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "pass",
                  "weight": 2,
                  "detail": "1 form(s) with named, labelled inputs and a submittable action an agent can complete.",
                  "rec": null
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 758 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A contact route (ContactPoint, mailto or tel) is available for an agent to hand off.",
                  "rec": null
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 52,
          "band": "Ambiguous identity",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 79,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "pass",
                  "weight": 2,
                  "detail": "Entity declared (Agility) with a description and descriptive depth.",
                  "rec": null
                },
                {
                  "label": "Identity consistency",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Entity name is consistent across surfaces, but no legal identifier (company number, VAT, LEI) is declared.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 60,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "2 confirmed and 0 unverified authoritative home(s) (of 7 declared; the rest did not resolve): x.com, linkedin.com.",
                  "rec": null
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "Profile links are present, but no CONFIRMED authoritative registry (Wikidata, Companies House, OpenCorporates) anchors them.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 10,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "5 extractable signals (statistics, figures, quotations, definitions) a model can lift and attribute.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 5,
              "reachable": 5,
              "confirmed": 2,
              "dead": 0,
              "links": [
                {
                  "host": "x.com",
                  "status": 200,
                  "state": "confirmed"
                },
                {
                  "host": "linkedin.com",
                  "status": 200,
                  "state": "confirmed"
                },
                {
                  "host": "instagram.com",
                  "status": 200,
                  "state": "reachable"
                },
                {
                  "host": "facebook.com",
                  "status": 200,
                  "state": "reachable"
                },
                {
                  "host": "youtube.com",
                  "status": 200,
                  "state": "reachable"
                }
              ],
              "scoringHosts": [
                "x.com",
                "linkedin.com"
              ],
              "confirmedHosts": [
                "x.com",
                "linkedin.com"
              ],
              "unverifiedHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "Yusen Logistics",
      "domain": "yusen-logistics.com",
      "ok": false,
      "reason": "UNREACHABLE (no response)",
      "wafVendor": ""
    },
    {
      "name": "Toll Group",
      "domain": "tollgroup.com",
      "ok": true,
      "finalUrl": "https://www.tollgroup.com/",
      "offDomain": "tollgroup.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 53,
        "execution": 65,
        "representation": 18,
        "composite": 45
      },
      "detail": {
        "retrieval": {
          "score": 53,
          "band": "Significant gaps",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 3,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, LocalBusiness or Person markup found.",
                  "rec": "Declare an Organisation (or LocalBusiness / Person) entity in JSON-LD so AI engines can identify and attribute you by name."
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 0,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No JSON-LD found.",
                  "rec": "Add JSON-LD structured data; it is how a machine reads your facts rather than guessing them."
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 83,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "19 of 27 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "1 question-led heading(s) or Q&A found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 H1, 16 H2, 16 H3.",
                  "rec": null
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 90,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 915 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 70 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Meta description is 68 characters.",
                  "rec": "Aim for a 70 to 180 character description; it is often quoted verbatim as your summary."
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "97% of 34 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 100,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "llms.txt present (200,000 characters); read today by coding and agent tools.",
                  "rec": null
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "No robots.txt is blocking AI crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "pass",
                  "weight": 1,
                  "detail": "3/3 Open Graph tags plus a Twitter card.",
                  "rec": null
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "1 image missing alt text"
            },
            {
              "sev": "warning",
              "label": "Title likely truncated in results (over 65 characters)"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 65,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No robots.txt is blocking retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 75,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "partial",
                  "weight": 2,
                  "detail": "No HTML form on this page, so an agent cannot complete a form-based task here.",
                  "rec": "Provide real <form> elements with a real action attribute, named inputs and <label>/aria-label, and no honeypot trap, so an agent can read and complete the task. Forms wired only in JavaScript are invisible to non-rendering agents."
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 915 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 100,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "llms.txt declares transactional or API surfaces for agents.",
                  "rec": null
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 18,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, Brand or Person entity in structured data.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 10,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "2 extractable signals (statistics, figures, quotations, definitions) a model can lift and attribute.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 100,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "pass",
                  "weight": 1,
                  "detail": "You actively govern representation: TDM reservation. (no training opt-out declared.)",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No machine-readable entity (Organisation / Brand / Person)"
            },
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "Ryder System",
      "domain": "ryder.com",
      "ok": true,
      "finalUrl": "https://www.ryder.com/en-us",
      "offDomain": "ryder.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 57,
        "execution": 58,
        "representation": 13,
        "composite": 43
      },
      "detail": {
        "retrieval": {
          "score": 57,
          "band": "Partly legible",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 3,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, LocalBusiness or Person markup found.",
                  "rec": "Declare an Organisation (or LocalBusiness / Person) entity in JSON-LD so AI engines can identify and attribute you by name."
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 0,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No JSON-LD found.",
                  "rec": "Add JSON-LD structured data; it is how a machine reads your facts rather than guessing them."
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 100,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "18 of 19 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "2 question-led heading(s) or Q&A found.",
                  "rec": null
                },
                {
                  "label": "Heading structure",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 H1, 12 H2, 0 H3.",
                  "rec": null
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 100,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1800 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 64 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 168 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 15 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 91,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "A sitemap exists but carries no lastmod dates.",
                  "rec": "Publish a sitemap.xml with lastmod dates and reference it in robots.txt."
                },
                {
                  "label": "Social / Open Graph",
                  "status": "pass",
                  "weight": 1,
                  "detail": "3/3 Open Graph tags plus a Twitter card.",
                  "rec": null
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "2 insecure HTTP resources on a secure page"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 58,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 60,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "partial",
                  "weight": 2,
                  "detail": "1 form(s) with named inputs, but no action attribute: submission is wired in JavaScript, so a non-rendering agent has no endpoint to post to.",
                  "rec": "Provide real <form> elements with a real action attribute, named inputs and <label>/aria-label, and no honeypot trap, so an agent can read and complete the task. Forms wired only in JavaScript are invisible to non-rendering agents."
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1800 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A contact route (ContactPoint, mailto or tel) is available for an agent to hand off.",
                  "rec": null
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "fail",
                  "weight": 1,
                  "detail": "An interactive CAPTCHA (hCaptcha, Cloudflare Turnstile or reCAPTCHA v2) is present; autonomous agents cannot pass it.",
                  "rec": "Do not gate primary actions behind an interactive CAPTCHA (hCaptcha, Turnstile, reCAPTCHA v2), which agents cannot solve. Invisible scoring (reCAPTCHA v3) is less hostile but can still block a low-scoring agent, so keep it off critical task paths."
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            },
            {
              "sev": "warning",
              "label": "Interactive CAPTCHA present; autonomous agents cannot complete it"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 13,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, Brand or Person entity in structured data.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 20,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "12 extractable signals (statistics, figures, quotations, definitions) a model can lift and attribute.",
                  "rec": null
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No machine-readable entity (Organisation / Brand / Person)"
            },
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "J.B. Hunt Transport Services",
      "domain": "jbhunt.com",
      "ok": true,
      "finalUrl": "https://www.jbhunt.com/",
      "offDomain": "jbhunt.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 66,
        "execution": 65,
        "representation": 23,
        "composite": 51
      },
      "detail": {
        "retrieval": {
          "score": 66,
          "band": "Partly legible",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 31,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "pass",
                  "weight": 2,
                  "detail": "Entity type declared: Organization.",
                  "rec": null
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 54,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 valid JSON-LD block(s).",
                  "rec": null
                },
                {
                  "label": "Linked entity graph",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "The page references a subject, but the schema is otherwise flat.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "Rich types present: Videoobject.",
                  "rec": null
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 67,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "15 of 26 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 H1, 4 H2, 15 H3.",
                  "rec": null
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 90,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 882 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 51 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 140 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "partial",
                  "weight": 1,
                  "detail": "64% of 25 images have alt text.",
                  "rec": "Give images descriptive alt text; it is readable context a model can use."
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 100,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "llms.txt present (23,032 characters); read today by coding and agent tools.",
                  "rec": null
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "pass",
                  "weight": 1,
                  "detail": "3/3 Open Graph tags plus a Twitter card.",
                  "rec": null
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "9 images missing alt text"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 65,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 75,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "pass",
                  "weight": 2,
                  "detail": "4 form(s) with named, labelled inputs and a submittable action an agent can complete.",
                  "rec": null
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 882 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "fail",
                  "weight": 1,
                  "detail": "An interactive CAPTCHA (hCaptcha, Cloudflare Turnstile or reCAPTCHA v2) is present; autonomous agents cannot pass it.",
                  "rec": "Do not gate primary actions behind an interactive CAPTCHA (hCaptcha, Turnstile, reCAPTCHA v2), which agents cannot solve. Invisible scoring (reCAPTCHA v3) is less hostile but can still block a low-scoring agent, so keep it off critical task paths."
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 100,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "llms.txt declares transactional or API surfaces for agents.",
                  "rec": null
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            },
            {
              "sev": "warning",
              "label": "Interactive CAPTCHA present; autonomous agents cannot complete it"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 23,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 50,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "partial",
                  "weight": 2,
                  "detail": "Entity declared (J.B. Hunt), but thin: no description; no knowsAbout / areaServed / founder detail.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Entity name is consistent across surfaces, but no legal identifier (company number, VAT, LEI) is declared.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 0,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Few extractable, quotable claims; little for a model to cite back to you.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "Landstar System",
      "domain": "landstar.com",
      "ok": true,
      "finalUrl": "https://www.landstar.com/",
      "offDomain": "landstar.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 62,
        "execution": 57,
        "representation": 23,
        "composite": 47
      },
      "detail": {
        "retrieval": {
          "score": 62,
          "band": "Partly legible",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 67,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "pass",
                  "weight": 2,
                  "detail": "Entity type declared: Organization.",
                  "rec": null
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "pass",
                  "weight": 2,
                  "detail": "4 distinct external profiles linked via sameAs.",
                  "rec": null
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Logo and contact details in structured data.",
                  "rec": null
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Your entity carries some descriptive depth.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 21,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 valid JSON-LD block(s).",
                  "rec": null
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 67,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "11 of 11 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 H1, 3 H2, 4 H3.",
                  "rec": null
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 85,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "About 459 words of readable text.",
                  "rec": "Give models enough clean, standalone prose to quote. This measures depth, not quality; a focused page can be cited at lower length, but very thin pages rarely are."
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 57 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 151 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No images to assess.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 78,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "No robots.txt is blocking AI crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "No sitemap found via robots.txt or /sitemap.xml.",
                  "rec": "Publish a sitemap.xml with lastmod dates and reference it in robots.txt."
                },
                {
                  "label": "Social / Open Graph",
                  "status": "partial",
                  "weight": 1,
                  "detail": "3/3 Open Graph tags, no Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No sitemap discoverable"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 57,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No robots.txt is blocking retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 80,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "partial",
                  "weight": 2,
                  "detail": "No HTML form on this page, so an agent cannot complete a form-based task here.",
                  "rec": "Provide real <form> elements with a real action attribute, named inputs and <label>/aria-label, and no honeypot trap, so an agent can read and complete the task. Forms wired only in JavaScript are invisible to non-rendering agents."
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 459 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A contact route (ContactPoint, mailto or tel) is available for an agent to hand off.",
                  "rec": null
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 25,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "No sitemap found via robots.txt or /sitemap.xml.",
                  "rec": "Publish a sitemap.xml and reference it in robots.txt so agents can enumerate your actionable pages."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 23,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 50,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "partial",
                  "weight": 2,
                  "detail": "Entity declared (Landstar System, Inc.), but thin: no knowsAbout / areaServed / founder detail.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Entity name is consistent across surfaces, but no legal identifier (company number, VAT, LEI) is declared.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "3 authoritative link(s) declared, but none resolved; dead links are not counted.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 0,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Few extractable, quotable claims; little for a model to cite back to you.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 3,
              "reachable": 3,
              "confirmed": 0,
              "dead": 0,
              "links": [
                {
                  "host": "facebook.com",
                  "status": 200,
                  "state": "reachable"
                },
                {
                  "host": "linkedin.com",
                  "status": 200,
                  "state": "reachable"
                },
                {
                  "host": "youtube.com",
                  "status": 200,
                  "state": "reachable"
                }
              ],
              "scoringHosts": [],
              "confirmedHosts": [],
              "unverifiedHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": [
        "sameas-unverified"
      ]
    },
    {
      "name": "Schneider National",
      "domain": "schneider.com",
      "ok": true,
      "finalUrl": "https://schneider.com/",
      "offDomain": "schneider.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 47,
        "execution": 65,
        "representation": 10,
        "composite": 41
      },
      "detail": {
        "retrieval": {
          "score": 47,
          "band": "Significant gaps",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 3,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, LocalBusiness or Person markup found.",
                  "rec": "Declare an Organisation (or LocalBusiness / Person) entity in JSON-LD so AI engines can identify and attribute you by name."
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 0,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No JSON-LD found.",
                  "rec": "Add JSON-LD structured data; it is how a machine reads your facts rather than guessing them."
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 67,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "9 of 11 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 H1, 6 H2, 2 H3.",
                  "rec": null
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 100,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 692 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 63 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 155 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 34 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 87,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "llms.txt present (9,307 characters); read today by coding and agent tools.",
                  "rec": null
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "A sitemap exists but carries no lastmod dates.",
                  "rec": "Publish a sitemap.xml with lastmod dates and reference it in robots.txt."
                },
                {
                  "label": "Social / Open Graph",
                  "status": "partial",
                  "weight": 1,
                  "detail": "3/3 Open Graph tags, no Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 65,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 75,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "partial",
                  "weight": 2,
                  "detail": "1 form(s) with named inputs, but no action attribute: submission is wired in JavaScript, so a non-rendering agent has no endpoint to post to.",
                  "rec": "Provide real <form> elements with a real action attribute, named inputs and <label>/aria-label, and no honeypot trap, so an agent can read and complete the task. Forms wired only in JavaScript are invisible to non-rendering agents."
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 692 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 100,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "llms.txt declares transactional or API surfaces for agents.",
                  "rec": null
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 10,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, Brand or Person entity in structured data.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 10,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "5 extractable signals (statistics, figures, quotations, definitions) a model can lift and attribute.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No machine-readable entity (Organisation / Brand / Person)"
            },
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "Werner Enterprises",
      "domain": "werner.com",
      "ok": true,
      "finalUrl": "https://www.werner.com/",
      "offDomain": "werner.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 71,
        "execution": 89,
        "representation": 41,
        "composite": 67
      },
      "detail": {
        "retrieval": {
          "score": 71,
          "band": "Partly legible",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 58,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "pass",
                  "weight": 2,
                  "detail": "Entity type declared: Corporation, Organization.",
                  "rec": null
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "pass",
                  "weight": 2,
                  "detail": "4 distinct external profiles linked via sameAs.",
                  "rec": null
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Logo and contact details in structured data.",
                  "rec": null
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 57,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 valid JSON-LD block(s).",
                  "rec": null
                },
                {
                  "label": "Linked entity graph",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "Entities are linked with @graph / @id, and the page references its subject.",
                  "rec": null
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "pass",
                  "weight": 1,
                  "detail": "datePublished / dateModified present in structured data.",
                  "rec": null
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 67,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "40 of 151 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 H1, 8 H2, 6 H3.",
                  "rec": null
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 100,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 2400 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 68 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 144 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "98% of 113 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 87,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "partial",
                  "weight": 1,
                  "detail": "2/3 Open Graph tags plus a Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "2 insecure HTTP resources on a secure page"
            },
            {
              "sev": "warning",
              "label": "2 images missing alt text"
            },
            {
              "sev": "warning",
              "label": "Title likely truncated in results (over 65 characters)"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 89,
          "band": "Agent-operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 71,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "pass",
                  "weight": 2.5,
                  "detail": "A consequential action is described in schema.",
                  "rec": null
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 100,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "pass",
                  "weight": 2,
                  "detail": "2 form(s) with named, labelled inputs and a submittable action an agent can complete.",
                  "rec": null
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 2400 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A contact route (ContactPoint, mailto or tel) is available for an agent to hand off.",
                  "rec": null
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 41,
          "band": "Ambiguous identity",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 50,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "partial",
                  "weight": 2,
                  "detail": "Entity declared (Werner Enterprises), but thin: no description; no knowsAbout / areaServed / founder detail.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Entity name is consistent across surfaces, but no legal identifier (company number, VAT, LEI) is declared.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 60,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "2 confirmed and 0 unverified authoritative home(s) (of 4 declared; the rest did not resolve): twitter.com, linkedin.com.",
                  "rec": null
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "Profile links are present, but no CONFIRMED authoritative registry (Wikidata, Companies House, OpenCorporates) anchors them.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 0,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Few extractable, quotable claims; little for a model to cite back to you.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 4,
              "reachable": 4,
              "confirmed": 2,
              "dead": 0,
              "links": [
                {
                  "host": "facebook.com",
                  "status": 200,
                  "state": "reachable"
                },
                {
                  "host": "twitter.com",
                  "status": 200,
                  "state": "confirmed"
                },
                {
                  "host": "instagram.com",
                  "status": 200,
                  "state": "reachable"
                },
                {
                  "host": "linkedin.com",
                  "status": 200,
                  "state": "confirmed"
                }
              ],
              "scoringHosts": [
                "twitter.com",
                "linkedin.com"
              ],
              "confirmedHosts": [
                "twitter.com",
                "linkedin.com"
              ],
              "unverifiedHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "Old Dominion Freight Line",
      "domain": "odfl.com",
      "ok": true,
      "finalUrl": "https://www.odfl.com/",
      "offDomain": "odfl.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 60,
        "execution": 69,
        "representation": 58,
        "composite": 62
      },
      "detail": {
        "retrieval": {
          "score": 60,
          "band": "Partly legible",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 67,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "pass",
                  "weight": 2,
                  "detail": "Entity type declared: Organization.",
                  "rec": null
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "pass",
                  "weight": 2,
                  "detail": "5 distinct external profiles linked via sameAs.",
                  "rec": null
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Logo and contact details in structured data.",
                  "rec": null
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Your entity carries some descriptive depth.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 21,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "3 valid JSON-LD block(s).",
                  "rec": null
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 50,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "18 of 37 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "3 H1, 1 H2, 13 H3.",
                  "rec": "Use exactly one H1, then H2/H3 to structure the content a model parses."
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 100,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1500 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 52 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 155 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "89% of 19 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 78,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "fail",
                  "weight": 1,
                  "detail": "0/3 Open Graph tags, no Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "Multiple H1 headings (3)"
            },
            {
              "sev": "warning",
              "label": "2 images missing alt text"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 69,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 100,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "pass",
                  "weight": 2,
                  "detail": "4 form(s) with named, labelled inputs and a submittable action an agent can complete.",
                  "rec": null
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1500 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A contact route (ContactPoint, mailto or tel) is available for an agent to hand off.",
                  "rec": null
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 58,
          "band": "Partly resolved",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 50,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "partial",
                  "weight": 2,
                  "detail": "Entity declared (Old Dominion Freight Line), but thin: no knowsAbout / areaServed / founder detail.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Entity name \"Old Dominion Freight Line\" is not clearly echoed in the title or og:site_name, which weakens disambiguation.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 100,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "2 confirmed and 0 unverified authoritative home(s) (of 5 declared; the rest did not resolve): en.wikipedia.org, linkedin.com.",
                  "rec": null
                },
                {
                  "label": "Spans registry and profile",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Identity spans a confirmed registry (en.wikipedia.org) and a profile source.",
                  "rec": null
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 20,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "7 extractable signals (statistics, figures, quotations, definitions) a model can lift and attribute.",
                  "rec": null
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 5,
              "reachable": 5,
              "confirmed": 2,
              "dead": 0,
              "links": [
                {
                  "host": "en.wikipedia.org",
                  "status": 200,
                  "state": "confirmed"
                },
                {
                  "host": "facebook.com",
                  "status": 200,
                  "state": "reachable"
                },
                {
                  "host": "twitter.com",
                  "status": 200,
                  "state": "reachable"
                },
                {
                  "host": "linkedin.com",
                  "status": 200,
                  "state": "confirmed"
                },
                {
                  "host": "instagram.com",
                  "status": 200,
                  "state": "reachable"
                }
              ],
              "scoringHosts": [
                "en.wikipedia.org",
                "linkedin.com"
              ],
              "confirmedHosts": [
                "en.wikipedia.org",
                "linkedin.com"
              ],
              "unverifiedHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "Knight-Swift Transportation",
      "domain": "knight-swift.com",
      "ok": true,
      "finalUrl": "https://knight-swift.com/",
      "offDomain": "knight-swift.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 22,
        "execution": 58,
        "representation": 8,
        "composite": 29
      },
      "detail": {
        "retrieval": {
          "score": 22,
          "band": "Largely invisible to AI",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 3,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, LocalBusiness or Person markup found.",
                  "rec": "Declare an Organisation (or LocalBusiness / Person) entity in JSON-LD so AI engines can identify and attribute you by name."
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 0,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No JSON-LD found.",
                  "rec": "Add JSON-LD structured data; it is how a machine reads your facts rather than guessing them."
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 0,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No paragraph content found.",
                  "rec": "Write several concise, self-contained paragraphs (roughly 40 to 450 characters, at least eight words each) that each answer a real question, rather than long unbroken blocks or repeated one-liners."
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "0 H1, 2 H2, 0 H3.",
                  "rec": "Use exactly one H1, then H2/H3 to structure the content a model parses."
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 20,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "About 121 words of readable text.",
                  "rec": "Give models enough clean, standalone prose to quote. This measures depth, not quality; a focused page can be cited at lower length, but very thin pages rarely are."
                },
                {
                  "label": "Title quality",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Title is 88 characters.",
                  "rec": "Aim for a 15 to 70 character title that states who you are and what you do."
                },
                {
                  "label": "Meta description quality",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No meta description found.",
                  "rec": "Add a clear meta description."
                },
                {
                  "label": "Image alt coverage",
                  "status": "fail",
                  "weight": 1,
                  "detail": "0% of 9 images have alt text.",
                  "rec": "Give images descriptive alt text; it is readable context a model can use."
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 96,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "pass",
                  "weight": 1,
                  "detail": "3/3 Open Graph tags plus a Twitter card.",
                  "rec": null
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No H1 heading on the page"
            },
            {
              "sev": "error",
              "label": "10 insecure HTTP resources on a secure page"
            },
            {
              "sev": "warning",
              "label": "9 images missing alt text"
            },
            {
              "sev": "warning",
              "label": "Title likely truncated in results (over 65 characters)"
            },
            {
              "sev": "warning",
              "label": "Missing meta description"
            },
            {
              "sev": "warning",
              "label": "Thin content (under 250 words)"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 58,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 60,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "partial",
                  "weight": 2,
                  "detail": "No HTML form on this page, so an agent cannot complete a form-based task here.",
                  "rec": "Provide real <form> elements with a real action attribute, named inputs and <label>/aria-label, and no honeypot trap, so an agent can read and complete the task. Forms wired only in JavaScript are invisible to non-rendering agents."
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Only about 121 words in the static HTML; some content likely depends on JavaScript.",
                  "rec": "Server-render or pre-render the primary content and controls. Agents and most crawlers do not execute JavaScript, so a client-rendered action surface is invisible to them."
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 8,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, Brand or Person entity in structured data.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 0,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Few extractable, quotable claims; little for a model to cite back to you.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No machine-readable entity (Organisation / Brand / Person)"
            },
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "ArcBest",
      "domain": "arcb.com",
      "ok": true,
      "finalUrl": "https://arcb.com/",
      "offDomain": "arcb.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 43,
        "execution": 71,
        "representation": 8,
        "composite": 41
      },
      "detail": {
        "retrieval": {
          "score": 43,
          "band": "Significant gaps",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 3,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, LocalBusiness or Person markup found.",
                  "rec": "Declare an Organisation (or LocalBusiness / Person) entity in JSON-LD so AI engines can identify and attribute you by name."
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 0,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No JSON-LD found.",
                  "rec": "Add JSON-LD structured data; it is how a machine reads your facts rather than guessing them."
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 67,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "22 of 34 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 H1, 10 H2, 6 H3.",
                  "rec": null
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 70,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1100 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Title is 14 characters.",
                  "rec": "Aim for a 15 to 70 character title that states who you are and what you do."
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 118 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "fail",
                  "weight": 1,
                  "detail": "44% of 45 images have alt text.",
                  "rec": "Give images descriptive alt text; it is readable context a model can use."
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 83,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "llms.txt present (200,000 characters); read today by coding and agent tools.",
                  "rec": null
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "fail",
                  "weight": 1,
                  "detail": "1/3 Open Graph tags plus a Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "25 images missing alt text"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 71,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 95,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "pass",
                  "weight": 2,
                  "detail": "4 form(s) with named, labelled inputs and a submittable action an agent can complete.",
                  "rec": null
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1100 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 100,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "llms.txt declares transactional or API surfaces for agents.",
                  "rec": null
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 8,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, Brand or Person entity in structured data.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 0,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Few extractable, quotable claims; little for a model to cite back to you.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No machine-readable entity (Organisation / Brand / Person)"
            },
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "Saia",
      "domain": "saia.com",
      "ok": false,
      "reason": "UNREADABLE (no content / client-side rendered)",
      "wafVendor": ""
    },
    {
      "name": "Hub Group",
      "domain": "hubgroup.com",
      "ok": true,
      "finalUrl": "https://www.hubgroup.com/",
      "offDomain": "hubgroup.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 60,
        "execution": 68,
        "representation": 32,
        "composite": 53
      },
      "detail": {
        "retrieval": {
          "score": 60,
          "band": "Partly legible",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 42,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "pass",
                  "weight": 2,
                  "detail": "Entity type declared: Organization.",
                  "rec": null
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "partial",
                  "weight": 2,
                  "detail": "2 distinct external profiles linked via sameAs.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 21,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 valid JSON-LD block(s).",
                  "rec": null
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 67,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "18 of 18 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 H1, 4 H2, 14 H3.",
                  "rec": null
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 100,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1100 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 62 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 158 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 4 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 87,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "partial",
                  "weight": 1,
                  "detail": "2/3 Open Graph tags plus a Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "1 insecure HTTP resource on a secure page"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 68,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 95,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "pass",
                  "weight": 2,
                  "detail": "5 form(s) with named, labelled inputs and a submittable action an agent can complete.",
                  "rec": null
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1100 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 32,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 50,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "partial",
                  "weight": 2,
                  "detail": "Entity declared (Hub Group), but thin: no description; no knowsAbout / areaServed / founder detail.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Entity name is consistent across surfaces, but no legal identifier (company number, VAT, LEI) is declared.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 30,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "1 confirmed and 0 unverified authoritative home(s) (of 2 declared; the rest did not resolve): linkedin.com.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "Profile links are present, but no CONFIRMED authoritative registry (Wikidata, Companies House, OpenCorporates) anchors them.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 0,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Few extractable, quotable claims; little for a model to cite back to you.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 2,
              "reachable": 2,
              "confirmed": 1,
              "dead": 0,
              "links": [
                {
                  "host": "facebook.com",
                  "status": 200,
                  "state": "reachable"
                },
                {
                  "host": "linkedin.com",
                  "status": 200,
                  "state": "confirmed"
                }
              ],
              "scoringHosts": [
                "linkedin.com"
              ],
              "confirmedHosts": [
                "linkedin.com"
              ],
              "unverifiedHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "Flexport",
      "domain": "flexport.com",
      "ok": true,
      "finalUrl": "https://www.flexport.com/",
      "offDomain": "flexport.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 72,
        "execution": 63,
        "representation": 53,
        "composite": 63
      },
      "detail": {
        "retrieval": {
          "score": 72,
          "band": "Partly legible",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 72,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "pass",
                  "weight": 2,
                  "detail": "Entity type declared: Organization, Person.",
                  "rec": null
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "pass",
                  "weight": 2,
                  "detail": "3 distinct external profiles linked via sameAs.",
                  "rec": null
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Logo and contact details in structured data.",
                  "rec": null
                },
                {
                  "label": "Authorship & credibility",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Author or person is named, but without credential depth.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Your entity carries some descriptive depth.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 43,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "2 valid JSON-LD block(s).",
                  "rec": null
                },
                {
                  "label": "Linked entity graph",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "Entities are linked with @graph / @id, and the page references its subject.",
                  "rec": null
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 67,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "11 of 33 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 H1, 32 H2, 8 H3.",
                  "rec": null
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 100,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1400 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 57 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 149 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 27 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 91,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "A sitemap exists but carries no lastmod dates.",
                  "rec": "Publish a sitemap.xml with lastmod dates and reference it in robots.txt."
                },
                {
                  "label": "Social / Open Graph",
                  "status": "pass",
                  "weight": 1,
                  "detail": "3/3 Open Graph tags plus a Twitter card.",
                  "rec": null
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 63,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 80,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "partial",
                  "weight": 2,
                  "detail": "No HTML form on this page, so an agent cannot complete a form-based task here.",
                  "rec": "Provide real <form> elements with a real action attribute, named inputs and <label>/aria-label, and no honeypot trap, so an agent can read and complete the task. Forms wired only in JavaScript are invisible to non-rendering agents."
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1400 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A contact route (ContactPoint, mailto or tel) is available for an agent to hand off.",
                  "rec": null
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 53,
          "band": "Ambiguous identity",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 50,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "partial",
                  "weight": 2,
                  "detail": "Entity declared (Flexport), but thin: no description.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Entity name is consistent across surfaces, but no legal identifier (company number, VAT, LEI) is declared.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 60,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "2 confirmed and 0 unverified authoritative home(s) (of 3 declared; the rest did not resolve): twitter.com, linkedin.com.",
                  "rec": null
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "Profile links are present, but no CONFIRMED authoritative registry (Wikidata, Companies House, OpenCorporates) anchors them.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 50,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "A person or author is named, but without credential depth.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "8 extractable signals (statistics, figures, quotations, definitions) a model can lift and attribute.",
                  "rec": null
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 3,
              "reachable": 3,
              "confirmed": 2,
              "dead": 0,
              "links": [
                {
                  "host": "facebook.com",
                  "status": 200,
                  "state": "reachable"
                },
                {
                  "host": "twitter.com",
                  "status": 200,
                  "state": "confirmed"
                },
                {
                  "host": "linkedin.com",
                  "status": 200,
                  "state": "confirmed"
                }
              ],
              "scoringHosts": [
                "twitter.com",
                "linkedin.com"
              ],
              "confirmedHosts": [
                "twitter.com",
                "linkedin.com"
              ],
              "unverifiedHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "Uber Freight",
      "domain": "uberfreight.com",
      "ok": true,
      "finalUrl": "https://www.uberfreight.com/en-US",
      "offDomain": "uberfreight.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 56,
        "execution": 62,
        "representation": 46,
        "composite": 55
      },
      "detail": {
        "retrieval": {
          "score": 56,
          "band": "Partly legible",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 53,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "pass",
                  "weight": 2,
                  "detail": "Entity type declared: Organization.",
                  "rec": null
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "pass",
                  "weight": 2,
                  "detail": "7 distinct external profiles linked via sameAs.",
                  "rec": null
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 21,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 valid JSON-LD block(s).",
                  "rec": null
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 33,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "9 of 15 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "0 H1, 10 H2, 4 H3.",
                  "rec": "Use exactly one H1, then H2/H3 to structure the content a model parses."
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 100,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 587 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 55 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 149 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 12 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 96,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "pass",
                  "weight": 1,
                  "detail": "3/3 Open Graph tags plus a Twitter card.",
                  "rec": null
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No H1 heading on the page"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 62,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 75,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "partial",
                  "weight": 2,
                  "detail": "No HTML form on this page, so an agent cannot complete a form-based task here.",
                  "rec": "Provide real <form> elements with a real action attribute, named inputs and <label>/aria-label, and no honeypot trap, so an agent can read and complete the task. Forms wired only in JavaScript are invisible to non-rendering agents."
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 587 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 46,
          "band": "Ambiguous identity",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 50,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "partial",
                  "weight": 2,
                  "detail": "Entity declared (Uber Freight), but thin: no description; no knowsAbout / areaServed / founder detail.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Entity name is consistent across surfaces, but no legal identifier (company number, VAT, LEI) is declared.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 60,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "2 confirmed and 0 unverified authoritative home(s) (of 5 declared; the rest did not resolve): linkedin.com, x.com.",
                  "rec": null
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "Profile links are present, but no CONFIRMED authoritative registry (Wikidata, Companies House, OpenCorporates) anchors them.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 20,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "7 extractable signals (statistics, figures, quotations, definitions) a model can lift and attribute.",
                  "rec": null
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 5,
              "reachable": 5,
              "confirmed": 2,
              "dead": 0,
              "links": [
                {
                  "host": "linkedin.com",
                  "status": 200,
                  "state": "confirmed"
                },
                {
                  "host": "youtube.com",
                  "status": 200,
                  "state": "reachable"
                },
                {
                  "host": "x.com",
                  "status": 200,
                  "state": "confirmed"
                },
                {
                  "host": "facebook.com",
                  "status": 200,
                  "state": "reachable"
                },
                {
                  "host": "instagram.com",
                  "status": 200,
                  "state": "reachable"
                }
              ],
              "scoringHosts": [
                "linkedin.com",
                "x.com"
              ],
              "confirmedHosts": [
                "linkedin.com",
                "x.com"
              ],
              "unverifiedHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "Kerry Logistics",
      "domain": "kerrylogistics.com",
      "ok": false,
      "reason": "UNREACHABLE (no response)",
      "wafVendor": ""
    },
    {
      "name": "CJ Logistics",
      "domain": "cjlogistics.com",
      "ok": false,
      "reason": "UNREACHABLE (no response)",
      "wafVendor": ""
    },
    {
      "name": "TFI International",
      "domain": "tfiintl.com",
      "ok": false,
      "reason": "UNREADABLE (no content / client-side rendered)",
      "wafVendor": ""
    },
    {
      "name": "Estes Express Lines",
      "domain": "estes-express.com",
      "ok": true,
      "finalUrl": "https://www.estes-express.com/",
      "offDomain": "estes-express.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 61,
        "execution": 66,
        "representation": 58,
        "composite": 62
      },
      "detail": {
        "retrieval": {
          "score": 61,
          "band": "Partly legible",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 67,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "pass",
                  "weight": 2,
                  "detail": "Entity type declared: Organization.",
                  "rec": null
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "pass",
                  "weight": 2,
                  "detail": "5 distinct external profiles linked via sameAs.",
                  "rec": null
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Logo and contact details in structured data.",
                  "rec": null
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Your entity carries some descriptive depth.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 21,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 valid JSON-LD block(s).",
                  "rec": null
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 50,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "14 of 17 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "3 H1, 5 H2, 6 H3.",
                  "rec": "Use exactly one H1, then H2/H3 to structure the content a model parses."
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 90,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 771 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 68 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Meta description is 255 characters.",
                  "rec": "Aim for a 70 to 180 character description; it is often quoted verbatim as your summary."
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 8 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 91,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "A sitemap exists but carries no lastmod dates.",
                  "rec": "Publish a sitemap.xml with lastmod dates and reference it in robots.txt."
                },
                {
                  "label": "Social / Open Graph",
                  "status": "pass",
                  "weight": 1,
                  "detail": "3/3 Open Graph tags plus a Twitter card.",
                  "rec": null
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "Multiple H1 headings (3)"
            },
            {
              "sev": "warning",
              "label": "Title likely truncated in results (over 65 characters)"
            },
            {
              "sev": "warning",
              "label": "Meta description over 180 characters"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 66,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 90,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "pass",
                  "weight": 2,
                  "detail": "4 form(s) with named, labelled inputs and a submittable action an agent can complete.",
                  "rec": null
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 771 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A contact route (ContactPoint, mailto or tel) is available for an agent to hand off.",
                  "rec": null
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "partial",
                  "weight": 1,
                  "detail": "An invisible reCAPTCHA v3 is present; it scores requests rather than blocking outright, but can still gate an action on a low score.",
                  "rec": "Do not gate primary actions behind an interactive CAPTCHA (hCaptcha, Turnstile, reCAPTCHA v2), which agents cannot solve. Invisible scoring (reCAPTCHA v3) is less hostile but can still block a low-scoring agent, so keep it off critical task paths."
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 58,
          "band": "Partly resolved",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 50,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "partial",
                  "weight": 2,
                  "detail": "Entity declared (Estes Express Lines), but thin: no knowsAbout / areaServed / founder detail.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Entity name is consistent across surfaces, but no legal identifier (company number, VAT, LEI) is declared.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 100,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "3 confirmed and 0 unverified authoritative home(s) (of 5 declared; the rest did not resolve): en.wikipedia.org, x.com, linkedin.com.",
                  "rec": null
                },
                {
                  "label": "Spans registry and profile",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Identity spans a confirmed registry (en.wikipedia.org) and a profile source.",
                  "rec": null
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 20,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "7 extractable signals (statistics, figures, quotations, definitions) a model can lift and attribute.",
                  "rec": null
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 5,
              "reachable": 5,
              "confirmed": 3,
              "dead": 0,
              "links": [
                {
                  "host": "en.wikipedia.org",
                  "status": 200,
                  "state": "confirmed"
                },
                {
                  "host": "facebook.com",
                  "status": 200,
                  "state": "reachable"
                },
                {
                  "host": "x.com",
                  "status": 200,
                  "state": "confirmed"
                },
                {
                  "host": "linkedin.com",
                  "status": 200,
                  "state": "confirmed"
                },
                {
                  "host": "instagram.com",
                  "status": 200,
                  "state": "reachable"
                }
              ],
              "scoringHosts": [
                "en.wikipedia.org",
                "x.com",
                "linkedin.com"
              ],
              "confirmedHosts": [
                "en.wikipedia.org",
                "x.com",
                "linkedin.com"
              ],
              "unverifiedHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "ID Logistics",
      "domain": "id-logistics.com",
      "ok": false,
      "reason": "UNREACHABLE (no response)",
      "wafVendor": ""
    },
    {
      "name": "Eddie Stobart",
      "domain": "eddiestobart.com",
      "ok": true,
      "finalUrl": "https://eddiestobart.com/",
      "offDomain": "eddiestobart.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 67,
        "execution": 79,
        "representation": 40,
        "composite": 62
      },
      "detail": {
        "retrieval": {
          "score": 67,
          "band": "Partly legible",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 36,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "pass",
                  "weight": 2,
                  "detail": "Entity type declared: Person, Organization.",
                  "rec": null
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Author or person is named, but without credential depth.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 79,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 valid JSON-LD block(s).",
                  "rec": null
                },
                {
                  "label": "Linked entity graph",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "Entities are linked with @graph / @id, and the page references its subject.",
                  "rec": null
                },
                {
                  "label": "Rich content types",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "Rich types present: Article.",
                  "rec": null
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "pass",
                  "weight": 1,
                  "detail": "datePublished / dateModified present in structured data.",
                  "rec": null
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 67,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "14 of 35 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 H1, 14 H2, 11 H3.",
                  "rec": null
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 80,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 789 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Title is 14 characters.",
                  "rec": "Aim for a 15 to 70 character title that states who you are and what you do."
                },
                {
                  "label": "Meta description quality",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Meta description is 4 characters.",
                  "rec": "Aim for a 70 to 180 character description; it is often quoted verbatim as your summary."
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "85% of 55 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 83,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "A sitemap exists but carries no lastmod dates.",
                  "rec": "Publish a sitemap.xml with lastmod dates and reference it in robots.txt."
                },
                {
                  "label": "Social / Open Graph",
                  "status": "partial",
                  "weight": 1,
                  "detail": "2/3 Open Graph tags plus a Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "8 images missing alt text"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 79,
          "band": "Agent-operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 71,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "pass",
                  "weight": 2.5,
                  "detail": "A consequential action is described in schema.",
                  "rec": null
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 65,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "partial",
                  "weight": 2,
                  "detail": "No HTML form on this page, so an agent cannot complete a form-based task here.",
                  "rec": "Provide real <form> elements with a real action attribute, named inputs and <label>/aria-label, and no honeypot trap, so an agent can read and complete the task. Forms wired only in JavaScript are invisible to non-rendering agents."
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 789 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "partial",
                  "weight": 1,
                  "detail": "An invisible reCAPTCHA v3 is present; it scores requests rather than blocking outright, but can still gate an action on a low score.",
                  "rec": "Do not gate primary actions behind an interactive CAPTCHA (hCaptcha, Turnstile, reCAPTCHA v2), which agents cannot solve. Invisible scoring (reCAPTCHA v3) is less hostile but can still block a low-scoring agent, so keep it off critical task paths."
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 40,
          "band": "Ambiguous identity",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 50,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "partial",
                  "weight": 2,
                  "detail": "Entity declared (Stobart), but thin: no description; no knowsAbout / areaServed / founder detail.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Entity name is consistent across surfaces, but no legal identifier (company number, VAT, LEI) is declared.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 40,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "A person or author is named, but without credential depth.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "5 extractable signals (statistics, figures, quotations, definitions) a model can lift and attribute.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 100,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "pass",
                  "weight": 1,
                  "detail": "You actively govern representation: TDM reservation. (no training opt-out declared.)",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "Menzies Distribution",
      "domain": "menziesdistribution.com",
      "ok": false,
      "reason": "BLOCKED (HTTP 403)",
      "wafVendor": "Cloudflare"
    },
    {
      "name": "Maersk",
      "domain": "maersk.com",
      "ok": true,
      "finalUrl": "https://www.maersk.com/",
      "offDomain": "maersk.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 61,
        "execution": 71,
        "representation": 41,
        "composite": 58
      },
      "detail": {
        "retrieval": {
          "score": 61,
          "band": "Partly legible",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 53,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "pass",
                  "weight": 2,
                  "detail": "Entity type declared: Organization.",
                  "rec": null
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "pass",
                  "weight": 2,
                  "detail": "7 distinct external profiles linked via sameAs.",
                  "rec": null
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 32,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 valid JSON-LD block(s).",
                  "rec": null
                },
                {
                  "label": "Linked entity graph",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Uses @graph / @id, but the page does not reference a subject entity.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 50,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "1 of 1 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": "Write several concise, self-contained paragraphs (roughly 40 to 450 characters, at least eight words each) that each answer a real question, rather than long unbroken blocks or repeated one-liners."
                },
                {
                  "label": "Question-led content",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "1 question-led heading(s) or Q&A found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 H1, 6 H2, 15 H3.",
                  "rec": null
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 85,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "About 495 words of readable text.",
                  "rec": "Give models enough clean, standalone prose to quote. This measures depth, not quality; a focused page can be cited at lower length, but very thin pages rarely are."
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 67 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 155 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 15 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 100,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "llms.txt present (7,283 characters); read today by coding and agent tools.",
                  "rec": null
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "pass",
                  "weight": 1,
                  "detail": "3/3 Open Graph tags plus a Twitter card.",
                  "rec": null
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "Title likely truncated in results (over 65 characters)"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 71,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot timeout, ClaudeBot timeout, GPTBot 200). 2 probe(s) returned a transient rate-limit or timeout and are not counted as a block.",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 95,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "pass",
                  "weight": 2,
                  "detail": "3 form(s) with named, labelled inputs and a submittable action an agent can complete.",
                  "rec": null
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 495 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 100,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "llms.txt declares transactional or API surfaces for agents.",
                  "rec": null
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 41,
          "band": "Ambiguous identity",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 50,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "partial",
                  "weight": 2,
                  "detail": "Entity declared (Maersk), but thin: no description; no knowsAbout / areaServed / founder detail.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Entity name is consistent across surfaces, but no legal identifier (company number, VAT, LEI) is declared.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 60,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "2 confirmed and 0 unverified authoritative home(s) (of 7 declared; the rest did not resolve): linkedin.com, x.com.",
                  "rec": null
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "Profile links are present, but no CONFIRMED authoritative registry (Wikidata, Companies House, OpenCorporates) anchors them.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 0,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Few extractable, quotable claims; little for a model to cite back to you.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 5,
              "reachable": 5,
              "confirmed": 2,
              "dead": 0,
              "links": [
                {
                  "host": "facebook.com",
                  "status": 200,
                  "state": "reachable"
                },
                {
                  "host": "instagram.com",
                  "status": 200,
                  "state": "reachable"
                },
                {
                  "host": "linkedin.com",
                  "status": 200,
                  "state": "confirmed"
                },
                {
                  "host": "tiktok.com",
                  "status": 200,
                  "state": "reachable"
                },
                {
                  "host": "x.com",
                  "status": 200,
                  "state": "confirmed"
                }
              ],
              "scoringHosts": [
                "linkedin.com",
                "x.com"
              ],
              "confirmedHosts": [
                "linkedin.com",
                "x.com"
              ],
              "unverifiedHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "MSC",
      "domain": "msc.com",
      "ok": false,
      "reason": "BLOCKED (HTTP 403)",
      "wafVendor": ""
    },
    {
      "name": "CMA CGM",
      "domain": "cma-cgm.com",
      "ok": false,
      "reason": "BLOCKED (HTTP 403)",
      "wafVendor": "Cloudflare"
    },
    {
      "name": "Hapag-Lloyd",
      "domain": "hapag-lloyd.com",
      "ok": false,
      "reason": "UNREACHABLE (no response)",
      "wafVendor": ""
    },
    {
      "name": "COSCO Shipping",
      "domain": "coscoshipping.com",
      "ok": false,
      "reason": "UNREACHABLE (no response)",
      "wafVendor": ""
    },
    {
      "name": "Ocean Network Express",
      "domain": "one-line.com",
      "ok": true,
      "finalUrl": "https://www.one-line.com/en",
      "offDomain": "one-line.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 45,
        "execution": 56,
        "representation": 8,
        "composite": 36
      },
      "detail": {
        "retrieval": {
          "score": 45,
          "band": "Significant gaps",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 3,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, LocalBusiness or Person markup found.",
                  "rec": "Declare an Organisation (or LocalBusiness / Person) entity in JSON-LD so AI engines can identify and attribute you by name."
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 0,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No JSON-LD found.",
                  "rec": "Add JSON-LD structured data; it is how a machine reads your facts rather than guessing them."
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 50,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "3 of 4 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": "Write several concise, self-contained paragraphs (roughly 40 to 450 characters, at least eight words each) that each answer a real question, rather than long unbroken blocks or repeated one-liners."
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 H1, 6 H2, 9 H3.",
                  "rec": null
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 100,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 677 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 45 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 170 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 13 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 96,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "pass",
                  "weight": 1,
                  "detail": "3/3 Open Graph tags plus a Twitter card.",
                  "rec": null
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 56,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 63,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "partial",
                  "weight": 3,
                  "detail": "Some AI agents are refused at the edge while a browser gets 200 (OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 403).",
                  "rec": "Your CDN or WAF is refusing AI user-agents at the network layer, so the page is invisible to those agents regardless of robots.txt. If you intend to be agent-reachable, allow the retrieval user-agents (OAI-SearchBot, PerplexityBot, Claude-SearchBot) in your bot-management or Pay-Per-Crawl settings. Note: we test this by sending these user-agent strings from our scanner, so it measures how your edge treats the user-agent; a real agent presents the same string from its own network, making this a strong signal rather than a guarantee."
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 95,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "pass",
                  "weight": 2,
                  "detail": "4 form(s) with named, labelled inputs and a submittable action an agent can complete.",
                  "rec": null
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 677 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "Some AI agents refused at the edge (GPTBot)"
            },
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 8,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, Brand or Person entity in structured data.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 0,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Few extractable, quotable claims; little for a model to cite back to you.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No machine-readable entity (Organisation / Brand / Person)"
            },
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "Evergreen Marine",
      "domain": "evergreen-marine.com",
      "ok": false,
      "reason": "UNREACHABLE (no response)",
      "wafVendor": ""
    },
    {
      "name": "Yang Ming",
      "domain": "yangming.com",
      "ok": false,
      "reason": "UNREACHABLE (no response)",
      "wafVendor": ""
    },
    {
      "name": "HMM",
      "domain": "hmm21.com",
      "ok": false,
      "reason": "UNREACHABLE (no response)",
      "wafVendor": ""
    },
    {
      "name": "ZIM",
      "domain": "zim.com",
      "ok": false,
      "reason": "BLOCKED (HTTP 403)",
      "wafVendor": ""
    },
    {
      "name": "Matson",
      "domain": "matson.com",
      "ok": false,
      "reason": "UNREACHABLE (no response)",
      "wafVendor": ""
    },
    {
      "name": "OOCL",
      "domain": "oocl.com",
      "ok": false,
      "reason": "UNREACHABLE (no response)",
      "wafVendor": ""
    },
    {
      "name": "NYK Line",
      "domain": "nyk.com",
      "ok": true,
      "finalUrl": "https://www.nyk.com/",
      "offDomain": "nyk.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 45,
        "execution": 63,
        "representation": 16,
        "composite": 41
      },
      "detail": {
        "retrieval": {
          "score": 45,
          "band": "Significant gaps",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 31,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "pass",
                  "weight": 2,
                  "detail": "Entity type declared: Organization.",
                  "rec": null
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 29,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "2 valid JSON-LD block(s).",
                  "rec": null
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Dates present in meta or <time> tags, but not in structured data.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 33,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "0 of 1 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": "Write several concise, self-contained paragraphs (roughly 40 to 450 characters, at least eight words each) that each answer a real question, rather than long unbroken blocks or repeated one-liners."
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 H1, 7 H2, 10 H3.",
                  "rec": null
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 50,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "About 222 words of readable text.",
                  "rec": "Give models enough clean, standalone prose to quote. This measures depth, not quality; a focused page can be cited at lower length, but very thin pages rarely are."
                },
                {
                  "label": "Title quality",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Title is 8 characters.",
                  "rec": "Aim for a 15 to 70 character title that states who you are and what you do."
                },
                {
                  "label": "Meta description quality",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Meta description is 61 characters.",
                  "rec": "Aim for a 70 to 180 character description; it is often quoted verbatim as your summary."
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 23 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 87,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "partial",
                  "weight": 1,
                  "detail": "3/3 Open Graph tags, no Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "Thin content (under 250 words)"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 63,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 80,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "pass",
                  "weight": 2,
                  "detail": "1 form(s) with named, labelled inputs and a submittable action an agent can complete.",
                  "rec": null
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Only about 222 words in the static HTML; some content likely depends on JavaScript.",
                  "rec": "Server-render or pre-render the primary content and controls. Agents and most crawlers do not execute JavaScript, so a client-rendered action surface is invisible to them."
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 16,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 29,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "partial",
                  "weight": 2,
                  "detail": "Entity declared (named), but thin: no description; no knowsAbout / areaServed / founder detail.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 0,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Few extractable, quotable claims; little for a model to cite back to you.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "Mitsui O.S.K. Lines",
      "domain": "mol.co.jp",
      "ok": false,
      "reason": "UNREACHABLE (no response)",
      "wafVendor": ""
    },
    {
      "name": "\"K\" Line",
      "domain": "kline.co.jp",
      "ok": false,
      "reason": "UNREACHABLE (no response)",
      "wafVendor": ""
    },
    {
      "name": "Stolt-Nielsen",
      "domain": "stolt-nielsen.com",
      "ok": false,
      "reason": "BLOCKED (HTTP 403)",
      "wafVendor": "Cloudflare"
    },
    {
      "name": "Star Bulk Carriers",
      "domain": "starbulk.com",
      "ok": true,
      "finalUrl": "https://www.starbulk.com/",
      "offDomain": "starbulk.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 30,
        "execution": 62,
        "representation": 13,
        "composite": 35
      },
      "detail": {
        "retrieval": {
          "score": 30,
          "band": "Largely invisible to AI",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 3,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, LocalBusiness or Person markup found.",
                  "rec": "Declare an Organisation (or LocalBusiness / Person) entity in JSON-LD so AI engines can identify and attribute you by name."
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 0,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No JSON-LD found.",
                  "rec": "Add JSON-LD structured data; it is how a machine reads your facts rather than guessing them."
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 17,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "3 of 3 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": "Write several concise, self-contained paragraphs (roughly 40 to 450 characters, at least eight words each) that each answer a real question, rather than long unbroken blocks or repeated one-liners."
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "0 H1, 3 H2, 0 H3.",
                  "rec": "Use exactly one H1, then H2/H3 to structure the content a model parses."
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 80,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 567 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 55 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 116 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "fail",
                  "weight": 1,
                  "detail": "11% of 9 images have alt text.",
                  "rec": "Give images descriptive alt text; it is readable context a model can use."
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 76,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "llms.txt present (49,149 characters); read today by coding and agent tools.",
                  "rec": null
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No canonical link found.",
                  "rec": "Declare a canonical URL so engines consolidate signals on one address."
                },
                {
                  "label": "Sitemap",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "A sitemap exists but carries no lastmod dates.",
                  "rec": "Publish a sitemap.xml with lastmod dates and reference it in robots.txt."
                },
                {
                  "label": "Social / Open Graph",
                  "status": "partial",
                  "weight": 1,
                  "detail": "3/3 Open Graph tags, no Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "partial",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, no lang.",
                  "rec": "Serve over HTTPS, add a responsive viewport meta tag, and set an html lang attribute."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No H1 heading on the page"
            },
            {
              "sev": "error",
              "label": "3 insecure HTTP resources on a secure page"
            },
            {
              "sev": "warning",
              "label": "8 images missing alt text"
            },
            {
              "sev": "warning",
              "label": "No canonical URL declared"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 62,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 65,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "partial",
                  "weight": 2,
                  "detail": "No HTML form on this page, so an agent cannot complete a form-based task here.",
                  "rec": "Provide real <form> elements with a real action attribute, named inputs and <label>/aria-label, and no honeypot trap, so an agent can read and complete the task. Forms wired only in JavaScript are invisible to non-rendering agents."
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 567 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "partial",
                  "weight": 1,
                  "detail": "An invisible reCAPTCHA v3 is present; it scores requests rather than blocking outright, but can still gate an action on a low score.",
                  "rec": "Do not gate primary actions behind an interactive CAPTCHA (hCaptcha, Turnstile, reCAPTCHA v2), which agents cannot solve. Invisible scoring (reCAPTCHA v3) is less hostile but can still block a low-scoring agent, so keep it off critical task paths."
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 100,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "llms.txt declares transactional or API surfaces for agents.",
                  "rec": null
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 13,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, Brand or Person entity in structured data.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 20,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "7 extractable signals (statistics, figures, quotations, definitions) a model can lift and attribute.",
                  "rec": null
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No usage terms found on the page (license, copyrightHolder, meta reservation), and the TDM reservation file (/.well-known/tdmrep.json) could not be read on this scan, so the declared-terms verdict is unmeasured rather than a definitive absence. (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No machine-readable entity (Organisation / Brand / Person)"
            },
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": true
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": [
        "tdmrep-unmeasured"
      ]
    },
    {
      "name": "Bahri",
      "domain": "bahri.sa",
      "ok": true,
      "finalUrl": "https://www.bahri.sa/",
      "offDomain": "bahri.sa",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 41,
        "execution": 62,
        "representation": 10,
        "composite": 38
      },
      "detail": {
        "retrieval": {
          "score": 41,
          "band": "Significant gaps",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 3,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, LocalBusiness or Person markup found.",
                  "rec": "Declare an Organisation (or LocalBusiness / Person) entity in JSON-LD so AI engines can identify and attribute you by name."
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 0,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No JSON-LD found.",
                  "rec": "Add JSON-LD structured data; it is how a machine reads your facts rather than guessing them."
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 50,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "23 of 50 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "4 H1, 5 H2, 4 H3.",
                  "rec": "Use exactly one H1, then H2/H3 to structure the content a model parses."
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 90,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 949 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Title is 5 characters.",
                  "rec": "Aim for a 15 to 70 character title that states who you are and what you do."
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 164 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 55 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 83,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No canonical link found.",
                  "rec": "Declare a canonical URL so engines consolidate signals on one address."
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "partial",
                  "weight": 1,
                  "detail": "2/3 Open Graph tags, no Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "Multiple H1 headings (4)"
            },
            {
              "sev": "warning",
              "label": "No canonical URL declared"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 62,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 75,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "partial",
                  "weight": 2,
                  "detail": "A form element is present but has no usable named inputs.",
                  "rec": "Provide real <form> elements with a real action attribute, named inputs and <label>/aria-label, and no honeypot trap, so an agent can read and complete the task. Forms wired only in JavaScript are invisible to non-rendering agents."
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 949 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 10,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, Brand or Person entity in structured data.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 10,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "4 extractable signals (statistics, figures, quotations, definitions) a model can lift and attribute.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No machine-readable entity (Organisation / Brand / Person)"
            },
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "Wallenius Wilhelmsen",
      "domain": "walleniuswilhelmsen.com",
      "ok": true,
      "finalUrl": "https://www.walleniuswilhelmsen.com/",
      "offDomain": "walleniuswilhelmsen.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 57,
        "execution": 82,
        "representation": 23,
        "composite": 54
      },
      "detail": {
        "retrieval": {
          "score": 57,
          "band": "Partly legible",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 31,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "pass",
                  "weight": 2,
                  "detail": "Entity type declared: Organization.",
                  "rec": null
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No logo and contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 32,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 valid JSON-LD block(s).",
                  "rec": null
                },
                {
                  "label": "Linked entity graph",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Uses @graph / @id, but the page does not reference a subject entity.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 67,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "11 of 22 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 H1, 4 H2, 3 H3.",
                  "rec": null
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 65,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "About 429 words of readable text.",
                  "rec": "Give models enough clean, standalone prose to quote. This measures depth, not quality; a focused page can be cited at lower length, but very thin pages rarely are."
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 63 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 120 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "fail",
                  "weight": 1,
                  "detail": "0% of 4 images have alt text.",
                  "rec": "Give images descriptive alt text; it is readable context a model can use."
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 91,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "A sitemap is referenced but its file could not be read on this scan, so its lastmod freshness is unmeasured.",
                  "rec": "Publish a sitemap.xml with lastmod dates and reference it in robots.txt."
                },
                {
                  "label": "Social / Open Graph",
                  "status": "pass",
                  "weight": 1,
                  "detail": "3/3 Open Graph tags plus a Twitter card.",
                  "rec": null
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "4 images missing alt text"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 82,
          "band": "Agent-operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 71,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "pass",
                  "weight": 2.5,
                  "detail": "A consequential action is described in schema.",
                  "rec": null
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 75,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "partial",
                  "weight": 2,
                  "detail": "1 form(s) with named inputs, but no action attribute: submission is wired in JavaScript, so a non-rendering agent has no endpoint to post to.",
                  "rec": "Provide real <form> elements with a real action attribute, named inputs and <label>/aria-label, and no honeypot trap, so an agent can read and complete the task. Forms wired only in JavaScript are invisible to non-rendering agents."
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 429 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 23,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 50,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "partial",
                  "weight": 2,
                  "detail": "Entity declared (Wallenius Wilhelmsen (WALWIL)), but thin: no description; no knowsAbout / areaServed / founder detail.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Entity name is consistent across surfaces, but no legal identifier (company number, VAT, LEI) is declared.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 0,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Few extractable, quotable claims; little for a model to cite back to you.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "Hoegh Autoliners",
      "domain": "hoeghautoliners.com",
      "ok": true,
      "finalUrl": "https://www.hoeghautoliners.com/",
      "offDomain": "hoeghautoliners.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 69,
        "execution": 68,
        "representation": 43,
        "composite": 60
      },
      "detail": {
        "retrieval": {
          "score": 69,
          "band": "Partly legible",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 53,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "pass",
                  "weight": 2,
                  "detail": "Entity type declared: Organization.",
                  "rec": null
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "pass",
                  "weight": 2,
                  "detail": "4 distinct external profiles linked via sameAs.",
                  "rec": null
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 21,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 valid JSON-LD block(s).",
                  "rec": null
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 83,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "18 of 26 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "1 question-led heading(s) or Q&A found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 H1, 13 H2, 12 H3.",
                  "rec": null
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 100,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1600 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 61 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 154 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 27 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 96,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "pass",
                  "weight": 1,
                  "detail": "3/3 Open Graph tags plus a Twitter card.",
                  "rec": null
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 68,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 95,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "pass",
                  "weight": 2,
                  "detail": "2 form(s) with named, labelled inputs and a submittable action an agent can complete.",
                  "rec": null
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1600 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 43,
          "band": "Ambiguous identity",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 50,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "partial",
                  "weight": 2,
                  "detail": "Entity declared (Höegh Autoliners), but thin: no description; no knowsAbout / areaServed / founder detail.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Entity name is consistent across surfaces, but no legal identifier (company number, VAT, LEI) is declared.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 60,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "2 confirmed and 0 unverified authoritative home(s) (of 4 declared; the rest did not resolve): linkedin.com, x.com.",
                  "rec": null
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "Profile links are present, but no CONFIRMED authoritative registry (Wikidata, Companies House, OpenCorporates) anchors them.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 10,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "3 extractable signals (statistics, figures, quotations, definitions) a model can lift and attribute.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 4,
              "reachable": 4,
              "confirmed": 2,
              "dead": 0,
              "links": [
                {
                  "host": "facebook.com",
                  "status": 200,
                  "state": "reachable"
                },
                {
                  "host": "youtube.com",
                  "status": 200,
                  "state": "reachable"
                },
                {
                  "host": "linkedin.com",
                  "status": 200,
                  "state": "confirmed"
                },
                {
                  "host": "x.com",
                  "status": 200,
                  "state": "confirmed"
                }
              ],
              "scoringHosts": [
                "linkedin.com",
                "x.com"
              ],
              "confirmedHosts": [
                "linkedin.com",
                "x.com"
              ],
              "unverifiedHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "DFDS",
      "domain": "dfds.com",
      "ok": true,
      "finalUrl": "https://www.dfds.com/en/passenger-ferries",
      "offDomain": "dfds.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 66,
        "execution": 62,
        "representation": 35,
        "composite": 54
      },
      "detail": {
        "retrieval": {
          "score": 66,
          "band": "Partly legible",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 67,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "pass",
                  "weight": 2,
                  "detail": "Entity type declared: Organization, Person.",
                  "rec": null
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "pass",
                  "weight": 2,
                  "detail": "4 distinct external profiles linked via sameAs (11 links in total).",
                  "rec": null
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Author or person is named, but without credential depth.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Your entity carries some descriptive depth.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 32,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 valid JSON-LD block(s).",
                  "rec": null
                },
                {
                  "label": "Linked entity graph",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Uses @graph / @id, but the page does not reference a subject entity.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 67,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "23 of 72 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 H1, 9 H2, 14 H3.",
                  "rec": null
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 100,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1300 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 37 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 74 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 16 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 76,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "A sitemap exists but carries no lastmod dates.",
                  "rec": "Publish a sitemap.xml with lastmod dates and reference it in robots.txt."
                },
                {
                  "label": "Social / Open Graph",
                  "status": "partial",
                  "weight": 1,
                  "detail": "2/3 Open Graph tags, no Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "partial",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, no lang.",
                  "rec": "Serve over HTTPS, add a responsive viewport meta tag, and set an html lang attribute."
                }
              ]
            }
          ],
          "issues": [],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 62,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 75,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "partial",
                  "weight": 2,
                  "detail": "1 form(s) with named inputs, but no action attribute: submission is wired in JavaScript, so a non-rendering agent has no endpoint to post to.",
                  "rec": "Provide real <form> elements with a real action attribute, named inputs and <label>/aria-label, and no honeypot trap, so an agent can read and complete the task. Forms wired only in JavaScript are invisible to non-rendering agents."
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1300 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 35,
          "band": "Ambiguous identity",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 50,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "partial",
                  "weight": 2,
                  "detail": "Entity declared (DFDS A/S), but thin: no description.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Entity name is consistent across surfaces, but no legal identifier (company number, VAT, LEI) is declared.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "4 authoritative link(s) declared, but none resolved; dead links are not counted.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 50,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "A person or author is named, but without credential depth.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "12 extractable signals (statistics, figures, quotations, definitions) a model can lift and attribute.",
                  "rec": null
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 5,
              "reachable": 5,
              "confirmed": 0,
              "dead": 0,
              "links": [
                {
                  "host": "facebook.com",
                  "status": 200,
                  "state": "reachable"
                },
                {
                  "host": "facebook.com",
                  "status": 200,
                  "state": "reachable"
                },
                {
                  "host": "facebook.com",
                  "status": 200,
                  "state": "reachable"
                },
                {
                  "host": "instagram.com",
                  "status": 200,
                  "state": "reachable"
                },
                {
                  "host": "instagram.com",
                  "status": 200,
                  "state": "reachable"
                }
              ],
              "scoringHosts": [],
              "confirmedHosts": [],
              "unverifiedHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": [
        "sameas-unverified"
      ]
    },
    {
      "name": "Stena Line",
      "domain": "stenaline.com",
      "ok": true,
      "finalUrl": "https://stenaline.com/",
      "offDomain": "stenaline.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 57,
        "execution": 82,
        "representation": 25,
        "composite": 55
      },
      "detail": {
        "retrieval": {
          "score": 57,
          "band": "Partly legible",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 42,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "pass",
                  "weight": 2,
                  "detail": "Entity type declared: Organization.",
                  "rec": null
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "pass",
                  "weight": 1,
                  "detail": "BreadcrumbList schema present.",
                  "rec": null
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 57,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 valid JSON-LD block(s).",
                  "rec": null
                },
                {
                  "label": "Linked entity graph",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "Entities are linked with @graph / @id, and the page references its subject.",
                  "rec": null
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "pass",
                  "weight": 1,
                  "detail": "datePublished / dateModified present in structured data.",
                  "rec": null
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 33,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "28 of 65 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "0 H1, 3 H2, 6 H3.",
                  "rec": "Use exactly one H1, then H2/H3 to structure the content a model parses."
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 90,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1400 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 20 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Meta description is 58 characters.",
                  "rec": "Aim for a 70 to 180 character description; it is often quoted verbatim as your summary."
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 5 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 87,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "partial",
                  "weight": 1,
                  "detail": "2/3 Open Graph tags plus a Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No H1 heading on the page"
            },
            {
              "sev": "error",
              "label": "1 insecure HTTP resource on a secure page"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 82,
          "band": "Agent-operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 71,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "pass",
                  "weight": 2.5,
                  "detail": "A consequential action is described in schema.",
                  "rec": null
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 75,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "partial",
                  "weight": 2,
                  "detail": "No HTML form on this page, so an agent cannot complete a form-based task here.",
                  "rec": "Provide real <form> elements with a real action attribute, named inputs and <label>/aria-label, and no honeypot trap, so an agent can read and complete the task. Forms wired only in JavaScript are invisible to non-rendering agents."
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1400 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 25,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 50,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "partial",
                  "weight": 2,
                  "detail": "Entity declared (Stena Line), but thin: no description; no knowsAbout / areaServed / founder detail.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Entity name \"Stena Line\" is not clearly echoed in the title or og:site_name, which weakens disambiguation.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 10,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "2 extractable signals (statistics, figures, quotations, definitions) a model can lift and attribute.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "P&O Ferries",
      "domain": "poferries.com",
      "ok": false,
      "reason": "BLOCKED (HTTP 403)",
      "wafVendor": ""
    },
    {
      "name": "Brittany Ferries",
      "domain": "brittany-ferries.co.uk",
      "ok": true,
      "finalUrl": "https://www.brittany-ferries.co.uk/",
      "offDomain": "brittany-ferries.co.uk",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 22,
        "execution": 34,
        "representation": 15,
        "composite": 24
      },
      "detail": {
        "retrieval": {
          "score": 22,
          "band": "Largely invisible to AI",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 3,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, LocalBusiness or Person markup found.",
                  "rec": "Declare an Organisation (or LocalBusiness / Person) entity in JSON-LD so AI engines can identify and attribute you by name."
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 0,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No JSON-LD found.",
                  "rec": "Add JSON-LD structured data; it is how a machine reads your facts rather than guessing them."
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 0,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "1 of 1 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": "Write several concise, self-contained paragraphs (roughly 40 to 450 characters, at least eight words each) that each answer a real question, rather than long unbroken blocks or repeated one-liners."
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "0 H1, 0 H2, 0 H3.",
                  "rec": "Use exactly one H1, then H2/H3 to structure the content a model parses."
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 50,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "About 21 words of readable text.",
                  "rec": "Give models enough clean, standalone prose to quote. This measures depth, not quality; a focused page can be cited at lower length, but very thin pages rarely are."
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 16 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No meta description found.",
                  "rec": "Add a clear meta description."
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 2 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 78,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "llms.txt present (12,136 characters); read today by coding and agent tools.",
                  "rec": null
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "A sitemap exists but carries no lastmod dates.",
                  "rec": "Publish a sitemap.xml with lastmod dates and reference it in robots.txt."
                },
                {
                  "label": "Social / Open Graph",
                  "status": "fail",
                  "weight": 1,
                  "detail": "1/3 Open Graph tags plus a Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No H1 heading on the page"
            },
            {
              "sev": "warning",
              "label": "Missing meta description"
            },
            {
              "sev": "warning",
              "label": "Thin content (under 250 words)"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 34,
          "band": "Closed to agents",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 45,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "partial",
                  "weight": 2,
                  "detail": "No HTML form on this page, so an agent cannot complete a form-based task here.",
                  "rec": "Provide real <form> elements with a real action attribute, named inputs and <label>/aria-label, and no honeypot trap, so an agent can read and complete the task. Forms wired only in JavaScript are invisible to non-rendering agents."
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Very little static content (~21 words); agents that do not run JavaScript will see almost nothing.",
                  "rec": "Server-render or pre-render the primary content and controls. Agents and most crawlers do not execute JavaScript, so a client-rendered action surface is invisible to them."
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 100,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "llms.txt declares transactional or API surfaces for agents.",
                  "rec": null
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            },
            {
              "sev": "error",
              "label": "Action surface appears client-side rendered; agents may see little"
            },
            {
              "sev": "warning",
              "label": "Reachable but nothing to operate (little content, no action, no form)"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 15,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, Brand or Person entity in structured data.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 0,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Few extractable, quotable claims; little for a model to cite back to you.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 100,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "pass",
                  "weight": 1,
                  "detail": "You actively govern representation: TDM reservation. (no training opt-out declared.)",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No machine-readable entity (Organisation / Brand / Person)"
            },
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "Irish Ferries",
      "domain": "irishferries.com",
      "ok": true,
      "finalUrl": "https://www.irishferries.com/uk-en/Travel-to-France/",
      "offDomain": "irishferries.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 49,
        "execution": 69,
        "representation": 10,
        "composite": 43
      },
      "detail": {
        "retrieval": {
          "score": 49,
          "band": "Significant gaps",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 3,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, LocalBusiness or Person markup found.",
                  "rec": "Declare an Organisation (or LocalBusiness / Person) entity in JSON-LD so AI engines can identify and attribute you by name."
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 0,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No JSON-LD found.",
                  "rec": "Add JSON-LD structured data; it is how a machine reads your facts rather than guessing them."
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 83,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "75 of 85 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "8 question-led heading(s) or Q&A found.",
                  "rec": null
                },
                {
                  "label": "Heading structure",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "12 H1, 19 H2, 29 H3.",
                  "rec": "Use exactly one H1, then H2/H3 to structure the content a model parses."
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 90,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 12000 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 60 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 113 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "partial",
                  "weight": 1,
                  "detail": "60% of 70 images have alt text.",
                  "rec": "Give images descriptive alt text; it is readable context a model can use."
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 78,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "No robots.txt is blocking AI crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "fail",
                  "weight": 1,
                  "detail": "0/3 Open Graph tags, no Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "Multiple H1 headings (12)"
            },
            {
              "sev": "warning",
              "label": "28 images missing alt text"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 69,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No robots.txt is blocking retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 100,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "pass",
                  "weight": 2,
                  "detail": "7 form(s) with named, labelled inputs and a submittable action an agent can complete.",
                  "rec": null
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 12000 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A contact route (ContactPoint, mailto or tel) is available for an agent to hand off.",
                  "rec": null
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 10,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, Brand or Person entity in structured data.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 10,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "5 extractable signals (statistics, figures, quotations, definitions) a model can lift and attribute.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No machine-readable entity (Organisation / Brand / Person)"
            },
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "Caledonian MacBrayne",
      "domain": "calmac.co.uk",
      "ok": true,
      "finalUrl": "https://www.calmac.co.uk/en-gb",
      "offDomain": "calmac.co.uk",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 57,
        "execution": 62,
        "representation": 8,
        "composite": 42
      },
      "detail": {
        "retrieval": {
          "score": 57,
          "band": "Partly legible",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 3,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, LocalBusiness or Person markup found.",
                  "rec": "Declare an Organisation (or LocalBusiness / Person) entity in JSON-LD so AI engines can identify and attribute you by name."
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 0,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No JSON-LD found.",
                  "rec": "Add JSON-LD structured data; it is how a machine reads your facts rather than guessing them."
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 100,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "18 of 72 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "4 question-led heading(s) or Q&A found.",
                  "rec": null
                },
                {
                  "label": "Heading structure",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 H1, 11 H2, 68 H3.",
                  "rec": null
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 90,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1200 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Title is 105 characters.",
                  "rec": "Aim for a 15 to 70 character title that states who you are and what you do."
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 148 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 71 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 96,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "pass",
                  "weight": 1,
                  "detail": "3/3 Open Graph tags plus a Twitter card.",
                  "rec": null
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "Title likely truncated in results (over 65 characters)"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 62,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 75,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "partial",
                  "weight": 2,
                  "detail": "No HTML form on this page, so an agent cannot complete a form-based task here.",
                  "rec": "Provide real <form> elements with a real action attribute, named inputs and <label>/aria-label, and no honeypot trap, so an agent can read and complete the task. Forms wired only in JavaScript are invisible to non-rendering agents."
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1200 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 8,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, Brand or Person entity in structured data.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 0,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Few extractable, quotable claims; little for a model to cite back to you.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No machine-readable entity (Organisation / Brand / Person)"
            },
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "DP World",
      "domain": "dpworld.com",
      "ok": true,
      "finalUrl": "https://www.dpworld.com/en",
      "offDomain": "dpworld.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 65,
        "execution": 66,
        "representation": 41,
        "composite": 57
      },
      "detail": {
        "retrieval": {
          "score": 65,
          "band": "Partly legible",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 58,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "pass",
                  "weight": 2,
                  "detail": "Entity type declared: Organization.",
                  "rec": null
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "pass",
                  "weight": 2,
                  "detail": "6 distinct external profiles linked via sameAs.",
                  "rec": null
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Logo and contact details in structured data.",
                  "rec": null
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 21,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 valid JSON-LD block(s).",
                  "rec": null
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 67,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "15 of 26 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 H1, 5 H2, 9 H3.",
                  "rec": null
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 100,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 739 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 59 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 170 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 71 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 91,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "llms.txt present (8,675 characters); read today by coding and agent tools.",
                  "rec": null
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "partial",
                  "weight": 1,
                  "detail": "3/3 Open Graph tags, no Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 66,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 80,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "partial",
                  "weight": 2,
                  "detail": "No HTML form on this page, so an agent cannot complete a form-based task here.",
                  "rec": "Provide real <form> elements with a real action attribute, named inputs and <label>/aria-label, and no honeypot trap, so an agent can read and complete the task. Forms wired only in JavaScript are invisible to non-rendering agents."
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 739 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A contact route (ContactPoint, mailto or tel) is available for an agent to hand off.",
                  "rec": null
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 100,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "llms.txt declares transactional or API surfaces for agents.",
                  "rec": null
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 41,
          "band": "Ambiguous identity",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 50,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "partial",
                  "weight": 2,
                  "detail": "Entity declared (DP World), but thin: no description; no knowsAbout / areaServed / founder detail.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Entity name is consistent across surfaces, but no legal identifier (company number, VAT, LEI) is declared.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 60,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "2 confirmed and 0 unverified authoritative home(s) (of 6 declared; the rest did not resolve): twitter.com, linkedin.com.",
                  "rec": null
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "Profile links are present, but no CONFIRMED authoritative registry (Wikidata, Companies House, OpenCorporates) anchors them.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 0,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Few extractable, quotable claims; little for a model to cite back to you.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 5,
              "reachable": 5,
              "confirmed": 2,
              "dead": 0,
              "links": [
                {
                  "host": "facebook.com",
                  "status": 200,
                  "state": "reachable"
                },
                {
                  "host": "twitter.com",
                  "status": 200,
                  "state": "confirmed"
                },
                {
                  "host": "instagram.com",
                  "status": 200,
                  "state": "reachable"
                },
                {
                  "host": "youtube.com",
                  "status": 200,
                  "state": "reachable"
                },
                {
                  "host": "linkedin.com",
                  "status": 200,
                  "state": "confirmed"
                }
              ],
              "scoringHosts": [
                "twitter.com",
                "linkedin.com"
              ],
              "confirmedHosts": [
                "twitter.com",
                "linkedin.com"
              ],
              "unverifiedHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "PSA International",
      "domain": "globalpsa.com",
      "ok": true,
      "finalUrl": "https://www.globalpsa.com/",
      "offDomain": "globalpsa.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 59,
        "execution": 79,
        "representation": 34,
        "composite": 57
      },
      "detail": {
        "retrieval": {
          "score": 59,
          "band": "Partly legible",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 53,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "pass",
                  "weight": 2,
                  "detail": "Entity type declared: Organization.",
                  "rec": null
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "partial",
                  "weight": 2,
                  "detail": "2 distinct external profiles linked via sameAs.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "pass",
                  "weight": 1,
                  "detail": "BreadcrumbList schema present.",
                  "rec": null
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 57,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 valid JSON-LD block(s).",
                  "rec": null
                },
                {
                  "label": "Linked entity graph",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "Entities are linked with @graph / @id, and the page references its subject.",
                  "rec": null
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "pass",
                  "weight": 1,
                  "detail": "datePublished / dateModified present in structured data.",
                  "rec": null
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 33,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "4 of 11 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": "Write several concise, self-contained paragraphs (roughly 40 to 450 characters, at least eight words each) that each answer a real question, rather than long unbroken blocks or repeated one-liners."
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "10 H1, 0 H2, 1 H3.",
                  "rec": "Use exactly one H1, then H2/H3 to structure the content a model parses."
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 90,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 802 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 24 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 123 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "partial",
                  "weight": 1,
                  "detail": "74% of 34 images have alt text.",
                  "rec": "Give images descriptive alt text; it is readable context a model can use."
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 83,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "robots.txt could not be read on this pass (a transient network fault or rate-limit), so AI crawler access is inconclusive and is not scored as a pass.",
                  "rec": "Re-run the scan. If robots.txt still will not load, confirm it responds with 200 and does not Disallow the AI answer crawlers (OAI-SearchBot, PerplexityBot, Claude-SearchBot)."
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "pass",
                  "weight": 1,
                  "detail": "3/3 Open Graph tags plus a Twitter card.",
                  "rec": null
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "Multiple H1 headings (10)"
            },
            {
              "sev": "warning",
              "label": "Heading levels skip from H1 to H3"
            },
            {
              "sev": "warning",
              "label": "9 images missing alt text"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": true
        },
        "execution": {
          "score": 79,
          "band": "Agent-operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 88,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "partial",
                  "weight": 1,
                  "detail": "robots.txt could not be read on this scan (a transient network fault or rate-limit), so the declared retrieval policy is unmeasured; held inconclusive, not scored as a pass or a block.",
                  "rec": "Re-run the scan. If robots.txt still will not load, confirm it responds with 200 and does not Disallow the retrieval agents (OAI-SearchBot, PerplexityBot, Claude-SearchBot)."
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 71,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "pass",
                  "weight": 2.5,
                  "detail": "A consequential action is described in schema.",
                  "rec": null
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 80,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "partial",
                  "weight": 2,
                  "detail": "No HTML form on this page, so an agent cannot complete a form-based task here.",
                  "rec": "Provide real <form> elements with a real action attribute, named inputs and <label>/aria-label, and no honeypot trap, so an agent can read and complete the task. Forms wired only in JavaScript are invisible to non-rendering agents."
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 802 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A contact route (ContactPoint, mailto or tel) is available for an agent to hand off.",
                  "rec": null
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [],
          "renderDependent": false,
          "robotsUnmeasured": true
        },
        "representation": {
          "score": 34,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 50,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "partial",
                  "weight": 2,
                  "detail": "Entity declared (PSA International), but thin: no description; no knowsAbout / areaServed / founder detail.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Entity name is consistent across surfaces, but no legal identifier (company number, VAT, LEI) is declared.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 30,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "1 confirmed and 0 unverified authoritative home(s) (of 2 declared; the rest did not resolve): linkedin.com.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "Profile links are present, but no CONFIRMED authoritative registry (Wikidata, Companies House, OpenCorporates) anchors them.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 10,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "3 extractable signals (statistics, figures, quotations, definitions) a model can lift and attribute.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (training-crawler posture unmeasured this scan: robots.txt could not be read.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 2,
              "reachable": 2,
              "confirmed": 1,
              "dead": 0,
              "links": [
                {
                  "host": "facebook.com",
                  "status": 200,
                  "state": "reachable"
                },
                {
                  "host": "linkedin.com",
                  "status": 200,
                  "state": "confirmed"
                }
              ],
              "scoringHosts": [
                "linkedin.com"
              ],
              "confirmedHosts": [
                "linkedin.com"
              ],
              "unverifiedHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": [
        "robots-unmeasured"
      ]
    },
    {
      "name": "Hutchison Ports",
      "domain": "hutchisonports.com",
      "ok": true,
      "finalUrl": "https://hutchisonports.com/en/index.html",
      "offDomain": "hutchisonports.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 19,
        "execution": 56,
        "representation": 8,
        "composite": 28
      },
      "detail": {
        "retrieval": {
          "score": 19,
          "band": "Largely invisible to AI",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 3,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, LocalBusiness or Person markup found.",
                  "rec": "Declare an Organisation (or LocalBusiness / Person) entity in JSON-LD so AI engines can identify and attribute you by name."
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 0,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No JSON-LD found.",
                  "rec": "Add JSON-LD structured data; it is how a machine reads your facts rather than guessing them."
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 0,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "0 of 6 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": "Write several concise, self-contained paragraphs (roughly 40 to 450 characters, at least eight words each) that each answer a real question, rather than long unbroken blocks or repeated one-liners."
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "0 H1, 4 H2, 3 H3.",
                  "rec": "Use exactly one H1, then H2/H3 to structure the content a model parses."
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 55,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "About 406 words of readable text.",
                  "rec": "Give models enough clean, standalone prose to quote. This measures depth, not quality; a focused page can be cited at lower length, but very thin pages rarely are."
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 22 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Meta description is 15 characters.",
                  "rec": "Aim for a 70 to 180 character description; it is often quoted verbatim as your summary."
                },
                {
                  "label": "Image alt coverage",
                  "status": "fail",
                  "weight": 1,
                  "detail": "54% of 13 images have alt text.",
                  "rec": "Give images descriptive alt text; it is readable context a model can use."
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 61,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "No robots.txt is blocking AI crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "fail",
                  "weight": 1,
                  "detail": "Page is set to noindex (meta or X-Robots-Tag); excluded from search and AI.",
                  "rec": "Remove the noindex directive; a noindexed page cannot be cited."
                },
                {
                  "label": "Canonical URL",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No canonical link found.",
                  "rec": "Declare a canonical URL so engines consolidate signals on one address."
                },
                {
                  "label": "Sitemap",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "/sitemap.xml could not be read on this scan (a transient network fault or rate-limit), so sitemap presence is unmeasured; not scored as missing.",
                  "rec": "Publish a sitemap.xml with lastmod dates and reference it in robots.txt."
                },
                {
                  "label": "Social / Open Graph",
                  "status": "partial",
                  "weight": 1,
                  "detail": "3/3 Open Graph tags, no Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No H1 heading on the page"
            },
            {
              "sev": "error",
              "label": "Page is set to noindex (excluded from search and AI)"
            },
            {
              "sev": "warning",
              "label": "6 images missing alt text"
            },
            {
              "sev": "warning",
              "label": "No canonical URL declared"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 56,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No robots.txt is blocking retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 75,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "partial",
                  "weight": 2,
                  "detail": "2 form(s) with named inputs, but no action attribute: submission is wired in JavaScript, so a non-rendering agent has no endpoint to post to.",
                  "rec": "Provide real <form> elements with a real action attribute, named inputs and <label>/aria-label, and no honeypot trap, so an agent can read and complete the task. Forms wired only in JavaScript are invisible to non-rendering agents."
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 406 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 25,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "No sitemap found via robots.txt or /sitemap.xml.",
                  "rec": "Publish a sitemap.xml and reference it in robots.txt so agents can enumerate your actionable pages."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 8,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, Brand or Person entity in structured data.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 0,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Few extractable, quotable claims; little for a model to cite back to you.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No machine-readable entity (Organisation / Brand / Person)"
            },
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "APM Terminals",
      "domain": "apmterminals.com",
      "ok": true,
      "finalUrl": "https://www.apmterminals.com/",
      "offDomain": "apmterminals.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 36,
        "execution": 46,
        "representation": 8,
        "composite": 30
      },
      "detail": {
        "retrieval": {
          "score": 36,
          "band": "Significant gaps",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 3,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, LocalBusiness or Person markup found.",
                  "rec": "Declare an Organisation (or LocalBusiness / Person) entity in JSON-LD so AI engines can identify and attribute you by name."
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 0,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No JSON-LD found.",
                  "rec": "Add JSON-LD structured data; it is how a machine reads your facts rather than guessing them."
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 50,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "4 of 4 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": "Write several concise, self-contained paragraphs (roughly 40 to 450 characters, at least eight words each) that each answer a real question, rather than long unbroken blocks or repeated one-liners."
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 H1, 2 H2, 6 H3.",
                  "rec": null
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 60,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "About 200 words of readable text.",
                  "rec": "Give models enough clean, standalone prose to quote. This measures depth, not quality; a focused page can be cited at lower length, but very thin pages rarely are."
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 20 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Meta description is 424 characters.",
                  "rec": "Aim for a 70 to 180 character description; it is often quoted verbatim as your summary."
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 8 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 74,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No canonical link found.",
                  "rec": "Declare a canonical URL so engines consolidate signals on one address."
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "fail",
                  "weight": 1,
                  "detail": "0/3 Open Graph tags, no Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "Meta description over 180 characters"
            },
            {
              "sev": "warning",
              "label": "No canonical URL declared"
            },
            {
              "sev": "warning",
              "label": "Thin content (under 250 words)"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 46,
          "band": "Major friction",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 63,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "partial",
                  "weight": 3,
                  "detail": "Could not establish a browser baseline (control returned timeout); agent results inconclusive. Probed: OAI-SearchBot 403, PerplexityBot timeout, ClaudeBot timeout, GPTBot 403.",
                  "rec": "Your CDN or WAF is refusing AI user-agents at the network layer, so the page is invisible to those agents regardless of robots.txt. If you intend to be agent-reachable, allow the retrieval user-agents (OAI-SearchBot, PerplexityBot, Claude-SearchBot) in your bot-management or Pay-Per-Crawl settings. Note: we test this by sending these user-agent strings from our scanner, so it measures how your edge treats the user-agent; a real agent presents the same string from its own network, making this a strong signal rather than a guarantee."
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 60,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "partial",
                  "weight": 2,
                  "detail": "No HTML form on this page, so an agent cannot complete a form-based task here.",
                  "rec": "Provide real <form> elements with a real action attribute, named inputs and <label>/aria-label, and no honeypot trap, so an agent can read and complete the task. Forms wired only in JavaScript are invisible to non-rendering agents."
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Only about 200 words in the static HTML; some content likely depends on JavaScript.",
                  "rec": "Server-render or pre-render the primary content and controls. Agents and most crawlers do not execute JavaScript, so a client-rendered action surface is invisible to them."
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "Some AI agents refused at the edge (OAI-SearchBot, GPTBot)"
            },
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 8,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, Brand or Person entity in structured data.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 0,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Few extractable, quotable claims; little for a model to cite back to you.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No machine-readable entity (Organisation / Brand / Person)"
            },
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": false,
        "consistent": null,
        "note": "browser-ua-unreadable"
      },
      "flags": []
    },
    {
      "name": "Associated British Ports",
      "domain": "abports.co.uk",
      "ok": false,
      "reason": "BLOCKED (HTTP 403)",
      "wafVendor": "Cloudflare"
    },
    {
      "name": "Peel Ports",
      "domain": "peelports.com",
      "ok": true,
      "finalUrl": "https://www.peelports.com/",
      "offDomain": "peelports.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 37,
        "execution": 62,
        "representation": 13,
        "composite": 37
      },
      "detail": {
        "retrieval": {
          "score": 37,
          "band": "Significant gaps",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 3,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, LocalBusiness or Person markup found.",
                  "rec": "Declare an Organisation (or LocalBusiness / Person) entity in JSON-LD so AI engines can identify and attribute you by name."
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 0,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No JSON-LD found.",
                  "rec": "Add JSON-LD structured data; it is how a machine reads your facts rather than guessing them."
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 50,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "16 of 28 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "7 H1, 5 H2, 7 H3.",
                  "rec": "Use exactly one H1, then H2/H3 to structure the content a model parses."
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 70,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1200 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Title is 4 characters.",
                  "rec": "Aim for a 15 to 70 character title that states who you are and what you do."
                },
                {
                  "label": "Meta description quality",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No meta description found.",
                  "rec": "Add a clear meta description."
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "92% of 25 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 74,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "A sitemap exists but carries no lastmod dates.",
                  "rec": "Publish a sitemap.xml with lastmod dates and reference it in robots.txt."
                },
                {
                  "label": "Social / Open Graph",
                  "status": "fail",
                  "weight": 1,
                  "detail": "1/3 Open Graph tags plus a Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "Multiple H1 headings (7)"
            },
            {
              "sev": "warning",
              "label": "2 images missing alt text"
            },
            {
              "sev": "warning",
              "label": "Missing meta description"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 62,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 75,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "partial",
                  "weight": 2,
                  "detail": "2 form(s) present, but inputs are poorly labelled.",
                  "rec": "Provide real <form> elements with a real action attribute, named inputs and <label>/aria-label, and no honeypot trap, so an agent can read and complete the task. Forms wired only in JavaScript are invisible to non-rendering agents."
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1200 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 13,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, Brand or Person entity in structured data.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 20,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "6 extractable signals (statistics, figures, quotations, definitions) a model can lift and attribute.",
                  "rec": null
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No machine-readable entity (Organisation / Brand / Person)"
            },
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "Forth Ports",
      "domain": "forthports.co.uk",
      "ok": false,
      "reason": "BLOCKED (HTTP 403)",
      "wafVendor": "Cloudflare"
    },
    {
      "name": "Port of London Authority",
      "domain": "pla.co.uk",
      "ok": false,
      "reason": "BLOCKED (HTTP 403)",
      "wafVendor": "Cloudflare"
    },
    {
      "name": "Port of Dover",
      "domain": "doverport.co.uk",
      "ok": true,
      "finalUrl": "https://www.portofdover.com/",
      "offDomain": "portofdover.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 62,
        "execution": 85,
        "representation": 30,
        "composite": 59
      },
      "detail": {
        "retrieval": {
          "score": 62,
          "band": "Partly legible",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 36,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "pass",
                  "weight": 2,
                  "detail": "Entity type declared: Person, Organization.",
                  "rec": null
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Author or person is named, but without credential depth.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 57,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 valid JSON-LD block(s).",
                  "rec": null
                },
                {
                  "label": "Linked entity graph",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "Entities are linked with @graph / @id, and the page references its subject.",
                  "rec": null
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "pass",
                  "weight": 1,
                  "detail": "datePublished / dateModified present in structured data.",
                  "rec": null
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 50,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "17 of 40 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "8 H1, 0 H2, 8 H3.",
                  "rec": "Use exactly one H1, then H2/H3 to structure the content a model parses."
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 100,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 658 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 59 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 116 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 74 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 87,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "partial",
                  "weight": 1,
                  "detail": "2/3 Open Graph tags plus a Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "Multiple H1 headings (8)"
            },
            {
              "sev": "warning",
              "label": "Heading levels skip from H1 to H3"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 85,
          "band": "Agent-operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 71,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "pass",
                  "weight": 2.5,
                  "detail": "A consequential action is described in schema.",
                  "rec": null
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 85,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "pass",
                  "weight": 2,
                  "detail": "2 form(s) with named, labelled inputs and a submittable action an agent can complete.",
                  "rec": null
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 658 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "partial",
                  "weight": 1,
                  "detail": "An invisible reCAPTCHA v3 is present; it scores requests rather than blocking outright, but can still gate an action on a low score.",
                  "rec": "Do not gate primary actions behind an interactive CAPTCHA (hCaptcha, Turnstile, reCAPTCHA v2), which agents cannot solve. Invisible scoring (reCAPTCHA v3) is less hostile but can still block a low-scoring agent, so keep it off critical task paths."
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 30,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 50,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "partial",
                  "weight": 2,
                  "detail": "Entity declared (Port of Dover), but thin: no description; no knowsAbout / areaServed / founder detail.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Entity name is consistent across surfaces, but no legal identifier (company number, VAT, LEI) is declared.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 30,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "A person or author is named, but without credential depth.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Few extractable, quotable claims; little for a model to cite back to you.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "Port of Rotterdam",
      "domain": "portofrotterdam.com",
      "ok": true,
      "finalUrl": "https://www.portofrotterdam.com/nl",
      "offDomain": "portofrotterdam.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 51,
        "execution": 30,
        "representation": 10,
        "composite": 30
      },
      "detail": {
        "retrieval": {
          "score": 51,
          "band": "Significant gaps",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 3,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, LocalBusiness or Person markup found.",
                  "rec": "Declare an Organisation (or LocalBusiness / Person) entity in JSON-LD so AI engines can identify and attribute you by name."
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 7,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No JSON-LD found.",
                  "rec": "Add JSON-LD structured data; it is how a machine reads your facts rather than guessing them."
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Dates present in meta or <time> tags, but not in structured data.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 83,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "7 of 11 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "2 question-led heading(s) or Q&A found.",
                  "rec": null
                },
                {
                  "label": "Heading structure",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "2 H1, 8 H2, 9 H3.",
                  "rec": "Use exactly one H1, then H2/H3 to structure the content a model parses."
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 100,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 768 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 42 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 104 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "89% of 9 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 78,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "fail",
                  "weight": 1,
                  "detail": "1/3 Open Graph tags, no Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "Multiple H1 headings (2)"
            },
            {
              "sev": "error",
              "label": "3 insecure HTTP resources on a secure page"
            },
            {
              "sev": "warning",
              "label": "1 image missing alt text"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 30,
          "band": "Closed to agents",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 25,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "fail",
                  "weight": 3,
                  "detail": "Every probed AI agent is refused at the edge while a browser gets 200 (OAI-SearchBot 403, PerplexityBot 403, ClaudeBot 403, GPTBot 403).",
                  "rec": "Your CDN or WAF is refusing AI user-agents at the network layer, so the page is invisible to those agents regardless of robots.txt. If you intend to be agent-reachable, allow the retrieval user-agents (OAI-SearchBot, PerplexityBot, Claude-SearchBot) in your bot-management or Pay-Per-Crawl settings. Note: we test this by sending these user-agent strings from our scanner, so it measures how your edge treats the user-agent; a real agent presents the same string from its own network, making this a strong signal rather than a guarantee."
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 100,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "pass",
                  "weight": 2,
                  "detail": "3 form(s) with named, labelled inputs and a submittable action an agent can complete.",
                  "rec": null
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 768 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A contact route (ContactPoint, mailto or tel) is available for an agent to hand off.",
                  "rec": null
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "AI agents are refused at the edge (CDN/WAF), not just in robots.txt"
            },
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 10,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, Brand or Person entity in structured data.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 10,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "3 extractable signals (statistics, figures, quotations, definitions) a model can lift and attribute.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No machine-readable entity (Organisation / Brand / Person)"
            },
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "Port of Antwerp-Bruges",
      "domain": "portofantwerpbruges.com",
      "ok": true,
      "finalUrl": "https://www.portofantwerpbruges.com/en",
      "offDomain": "portofantwerpbruges.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 38,
        "execution": 34,
        "representation": 23,
        "composite": 32
      },
      "detail": {
        "retrieval": {
          "score": 38,
          "band": "Significant gaps",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 36,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "pass",
                  "weight": 2,
                  "detail": "Entity type declared: Organization.",
                  "rec": null
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Logo and contact details in structured data.",
                  "rec": null
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 21,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 valid JSON-LD block(s).",
                  "rec": null
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 0,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No paragraph content found.",
                  "rec": "Write several concise, self-contained paragraphs (roughly 40 to 450 characters, at least eight words each) that each answer a real question, rather than long unbroken blocks or repeated one-liners."
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "0 H1, 0 H2, 0 H3.",
                  "rec": "Use exactly one H1, then H2/H3 to structure the content a model parses."
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 65,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "About 10 words of readable text.",
                  "rec": "Give models enough clean, standalone prose to quote. This measures depth, not quality; a focused page can be cited at lower length, but very thin pages rarely are."
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 51 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 138 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No images to assess.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No lists, landmarks or header tables found.",
                  "rec": "Use lists, <main>/<article> landmarks and tables with <th> headers; they help AI parsers isolate and extract your content cleanly."
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 91,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "A sitemap exists but carries no lastmod dates.",
                  "rec": "Publish a sitemap.xml with lastmod dates and reference it in robots.txt."
                },
                {
                  "label": "Social / Open Graph",
                  "status": "pass",
                  "weight": 1,
                  "detail": "3/3 Open Graph tags plus a Twitter card.",
                  "rec": null
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No H1 heading on the page"
            },
            {
              "sev": "warning",
              "label": "Thin content (under 250 words)"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 34,
          "band": "Closed to agents",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 50,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "partial",
                  "weight": 2,
                  "detail": "No HTML form on this page, so an agent cannot complete a form-based task here.",
                  "rec": "Provide real <form> elements with a real action attribute, named inputs and <label>/aria-label, and no honeypot trap, so an agent can read and complete the task. Forms wired only in JavaScript are invisible to non-rendering agents."
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Very little static content (~10 words); agents that do not run JavaScript will see almost nothing.",
                  "rec": "Server-render or pre-render the primary content and controls. Agents and most crawlers do not execute JavaScript, so a client-rendered action surface is invisible to them."
                },
                {
                  "label": "Machine-readable contact",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A contact route (ContactPoint, mailto or tel) is available for an agent to hand off.",
                  "rec": null
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            },
            {
              "sev": "error",
              "label": "Action surface appears client-side rendered; agents may see little"
            },
            {
              "sev": "warning",
              "label": "Reachable but nothing to operate (little content, no action, no form)"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 23,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 50,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "partial",
                  "weight": 2,
                  "detail": "Entity declared (Port of Antwerp Bruges), but thin: no description; no knowsAbout / areaServed / founder detail.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Entity name is consistent across surfaces, but no legal identifier (company number, VAT, LEI) is declared.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 0,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Few extractable, quotable claims; little for a model to cite back to you.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "HHLA",
      "domain": "hhla.de",
      "ok": true,
      "finalUrl": "https://hhla.de/",
      "offDomain": "hhla.de",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 50,
        "execution": 76,
        "representation": 8,
        "composite": 45
      },
      "detail": {
        "retrieval": {
          "score": 50,
          "band": "Significant gaps",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 3,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, LocalBusiness or Person markup found.",
                  "rec": "Declare an Organisation (or LocalBusiness / Person) entity in JSON-LD so AI engines can identify and attribute you by name."
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 21,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 valid JSON-LD block(s).",
                  "rec": null
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 67,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "12 of 48 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 H1, 5 H2, 23 H3.",
                  "rec": null
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 90,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1300 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 17 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Meta description is 193 characters.",
                  "rec": "Aim for a 70 to 180 character description; it is often quoted verbatim as your summary."
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "97% of 39 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 87,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "No robots.txt is blocking AI crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "partial",
                  "weight": 1,
                  "detail": "2/3 Open Graph tags plus a Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "1 insecure HTTP resource on a secure page"
            },
            {
              "sev": "warning",
              "label": "1 image missing alt text"
            },
            {
              "sev": "warning",
              "label": "Meta description over 180 characters"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 76,
          "band": "Agent-operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 63,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "partial",
                  "weight": 3,
                  "detail": "Some AI agents are refused at the edge while a browser gets 200 (OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 403, GPTBot 403).",
                  "rec": "Your CDN or WAF is refusing AI user-agents at the network layer, so the page is invisible to those agents regardless of robots.txt. If you intend to be agent-reachable, allow the retrieval user-agents (OAI-SearchBot, PerplexityBot, Claude-SearchBot) in your bot-management or Pay-Per-Crawl settings. Note: we test this by sending these user-agent strings from our scanner, so it measures how your edge treats the user-agent; a real agent presents the same string from its own network, making this a strong signal rather than a guarantee."
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No robots.txt is blocking retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 71,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "pass",
                  "weight": 2.5,
                  "detail": "A consequential action is described in schema.",
                  "rec": null
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 95,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "pass",
                  "weight": 2,
                  "detail": "1 form(s) with named, labelled inputs and a submittable action an agent can complete.",
                  "rec": null
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1300 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "Some AI agents refused at the edge (ClaudeBot, GPTBot)"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 8,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, Brand or Person entity in structured data.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 0,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Few extractable, quotable claims; little for a model to cite back to you.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No machine-readable entity (Organisation / Brand / Person)"
            },
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "Port of Los Angeles",
      "domain": "portoflosangeles.org",
      "ok": true,
      "finalUrl": "https://portoflosangeles.org/",
      "offDomain": "portoflosangeles.org",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 44,
        "execution": 30,
        "representation": 10,
        "composite": 28
      },
      "detail": {
        "retrieval": {
          "score": 44,
          "band": "Significant gaps",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 3,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, LocalBusiness or Person markup found.",
                  "rec": "Declare an Organisation (or LocalBusiness / Person) entity in JSON-LD so AI engines can identify and attribute you by name."
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 0,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No JSON-LD found.",
                  "rec": "Add JSON-LD structured data; it is how a machine reads your facts rather than guessing them."
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 67,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "9 of 24 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "1 question-led heading(s) or Q&A found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "4 H1, 3 H2, 11 H3.",
                  "rec": "Use exactly one H1, then H2/H3 to structure the content a model parses."
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 90,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1000 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Title is 71 characters.",
                  "rec": "Aim for a 15 to 70 character title that states who you are and what you do."
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 164 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 21 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 74,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No canonical link found.",
                  "rec": "Declare a canonical URL so engines consolidate signals on one address."
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "fail",
                  "weight": 1,
                  "detail": "0/3 Open Graph tags, no Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "Multiple H1 headings (4)"
            },
            {
              "sev": "error",
              "label": "4 insecure HTTP resources on a secure page"
            },
            {
              "sev": "warning",
              "label": "Title likely truncated in results (over 65 characters)"
            },
            {
              "sev": "warning",
              "label": "No canonical URL declared"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 30,
          "band": "Closed to agents",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 25,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "fail",
                  "weight": 3,
                  "detail": "Every probed AI agent is refused at the edge while a browser gets 200 (OAI-SearchBot 403, PerplexityBot 403, ClaudeBot 403, GPTBot 403).",
                  "rec": "Your CDN or WAF is refusing AI user-agents at the network layer, so the page is invisible to those agents regardless of robots.txt. If you intend to be agent-reachable, allow the retrieval user-agents (OAI-SearchBot, PerplexityBot, Claude-SearchBot) in your bot-management or Pay-Per-Crawl settings. Note: we test this by sending these user-agent strings from our scanner, so it measures how your edge treats the user-agent; a real agent presents the same string from its own network, making this a strong signal rather than a guarantee."
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 80,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "pass",
                  "weight": 2,
                  "detail": "2 form(s) with named, labelled inputs and a submittable action an agent can complete.",
                  "rec": null
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1000 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A contact route (ContactPoint, mailto or tel) is available for an agent to hand off.",
                  "rec": null
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "fail",
                  "weight": 1,
                  "detail": "An interactive CAPTCHA (hCaptcha, Cloudflare Turnstile or reCAPTCHA v2) is present; autonomous agents cannot pass it.",
                  "rec": "Do not gate primary actions behind an interactive CAPTCHA (hCaptcha, Turnstile, reCAPTCHA v2), which agents cannot solve. Invisible scoring (reCAPTCHA v3) is less hostile but can still block a low-scoring agent, so keep it off critical task paths."
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "AI agents are refused at the edge (CDN/WAF), not just in robots.txt"
            },
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            },
            {
              "sev": "warning",
              "label": "Interactive CAPTCHA present; autonomous agents cannot complete it"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 10,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, Brand or Person entity in structured data.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 10,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "3 extractable signals (statistics, figures, quotations, definitions) a model can lift and attribute.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No machine-readable entity (Organisation / Brand / Person)"
            },
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "Port of Long Beach",
      "domain": "polb.com",
      "ok": true,
      "finalUrl": "https://polb.com/",
      "offDomain": "polb.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 20,
        "execution": 46,
        "representation": 8,
        "composite": 25
      },
      "detail": {
        "retrieval": {
          "score": 20,
          "band": "Largely invisible to AI",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 3,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, LocalBusiness or Person markup found.",
                  "rec": "Declare an Organisation (or LocalBusiness / Person) entity in JSON-LD so AI engines can identify and attribute you by name."
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 0,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No JSON-LD found.",
                  "rec": "Add JSON-LD structured data; it is how a machine reads your facts rather than guessing them."
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 0,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "1 of 5 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": "Write several concise, self-contained paragraphs (roughly 40 to 450 characters, at least eight words each) that each answer a real question, rather than long unbroken blocks or repeated one-liners."
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "0 H1, 1 H2, 0 H3.",
                  "rec": "Use exactly one H1, then H2/H3 to structure the content a model parses."
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 55,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "About 286 words of readable text.",
                  "rec": "Give models enough clean, standalone prose to quote. This measures depth, not quality; a focused page can be cited at lower length, but very thin pages rarely are."
                },
                {
                  "label": "Title quality",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Title is 5 characters.",
                  "rec": "Aim for a 15 to 70 character title that states who you are and what you do."
                },
                {
                  "label": "Meta description quality",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No meta description found.",
                  "rec": "Add a clear meta description."
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 14 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 63,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No canonical link found.",
                  "rec": "Declare a canonical URL so engines consolidate signals on one address."
                },
                {
                  "label": "Sitemap",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "A sitemap exists but carries no lastmod dates.",
                  "rec": "Publish a sitemap.xml with lastmod dates and reference it in robots.txt."
                },
                {
                  "label": "Social / Open Graph",
                  "status": "fail",
                  "weight": 1,
                  "detail": "0/3 Open Graph tags, no Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "partial",
                  "weight": 0.75,
                  "detail": "HTTPS, no viewport, lang set.",
                  "rec": "Serve over HTTPS, add a responsive viewport meta tag, and set an html lang attribute."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No H1 heading on the page"
            },
            {
              "sev": "warning",
              "label": "Missing meta description"
            },
            {
              "sev": "warning",
              "label": "No canonical URL declared"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 46,
          "band": "Major friction",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 63,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "partial",
                  "weight": 3,
                  "detail": "Could not establish a browser baseline (control returned 403); agent results inconclusive. Probed: OAI-SearchBot 403, PerplexityBot 403, ClaudeBot 403, GPTBot 403.",
                  "rec": "Your CDN or WAF is refusing AI user-agents at the network layer, so the page is invisible to those agents regardless of robots.txt. If you intend to be agent-reachable, allow the retrieval user-agents (OAI-SearchBot, PerplexityBot, Claude-SearchBot) in your bot-management or Pay-Per-Crawl settings. Note: we test this by sending these user-agent strings from our scanner, so it measures how your edge treats the user-agent; a real agent presents the same string from its own network, making this a strong signal rather than a guarantee."
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 60,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "partial",
                  "weight": 2,
                  "detail": "No HTML form on this page, so an agent cannot complete a form-based task here.",
                  "rec": "Provide real <form> elements with a real action attribute, named inputs and <label>/aria-label, and no honeypot trap, so an agent can read and complete the task. Forms wired only in JavaScript are invisible to non-rendering agents."
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Only about 286 words in the static HTML; some content likely depends on JavaScript.",
                  "rec": "Server-render or pre-render the primary content and controls. Agents and most crawlers do not execute JavaScript, so a client-rendered action surface is invisible to them."
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "Some AI agents refused at the edge (OAI-SearchBot, PerplexityBot, ClaudeBot, GPTBot)"
            },
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 8,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, Brand or Person entity in structured data.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 0,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Few extractable, quotable claims; little for a model to cite back to you.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No machine-readable entity (Organisation / Brand / Person)"
            },
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": false,
        "consistent": null,
        "note": "browser-ua-unreadable"
      },
      "flags": []
    },
    {
      "name": "ICTSI",
      "domain": "ictsi.com",
      "ok": true,
      "finalUrl": "https://ictsi.com/",
      "offDomain": "ictsi.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 44,
        "execution": 68,
        "representation": 10,
        "composite": 41
      },
      "detail": {
        "retrieval": {
          "score": 44,
          "band": "Significant gaps",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 3,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, LocalBusiness or Person markup found.",
                  "rec": "Declare an Organisation (or LocalBusiness / Person) entity in JSON-LD so AI engines can identify and attribute you by name."
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 0,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No JSON-LD found.",
                  "rec": "Add JSON-LD structured data; it is how a machine reads your facts rather than guessing them."
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 67,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "8 of 17 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 H1, 13 H2, 1 H3.",
                  "rec": null
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 90,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 672 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Title is 5 characters.",
                  "rec": "Aim for a 15 to 70 character title that states who you are and what you do."
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 120 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 14 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 78,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "fail",
                  "weight": 1,
                  "detail": "0/3 Open Graph tags, no Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 68,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 95,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "pass",
                  "weight": 2,
                  "detail": "1 form(s) with named, labelled inputs and a submittable action an agent can complete.",
                  "rec": null
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 672 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 10,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, Brand or Person entity in structured data.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 10,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "4 extractable signals (statistics, figures, quotations, definitions) a model can lift and attribute.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No machine-readable entity (Organisation / Brand / Person)"
            },
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "Adani Ports",
      "domain": "adaniports.com",
      "ok": true,
      "finalUrl": "https://www.adaniports.com/",
      "offDomain": "adaniports.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 53,
        "execution": 66,
        "representation": 10,
        "composite": 43
      },
      "detail": {
        "retrieval": {
          "score": 53,
          "band": "Significant gaps",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 36,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, LocalBusiness or Person markup found.",
                  "rec": "Declare an Organisation (or LocalBusiness / Person) entity in JSON-LD so AI engines can identify and attribute you by name."
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "pass",
                  "weight": 2,
                  "detail": "3 distinct external profiles linked via sameAs.",
                  "rec": null
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Logo and contact details in structured data.",
                  "rec": null
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 21,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 valid JSON-LD block(s).",
                  "rec": null
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 50,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "18 of 66 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "2 H1, 31 H2, 17 H3.",
                  "rec": "Use exactly one H1, then H2/H3 to structure the content a model parses."
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 90,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1200 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 23 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Meta description is 231 characters.",
                  "rec": "Aim for a 70 to 180 character description; it is often quoted verbatim as your summary."
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "98% of 46 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 87,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "partial",
                  "weight": 1,
                  "detail": "3/3 Open Graph tags, no Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "Multiple H1 headings (2)"
            },
            {
              "sev": "error",
              "label": "18 insecure HTTP resources on a secure page"
            },
            {
              "sev": "warning",
              "label": "1 image missing alt text"
            },
            {
              "sev": "warning",
              "label": "Meta description over 180 characters"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 66,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 90,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "pass",
                  "weight": 2,
                  "detail": "1 form(s) with named, labelled inputs and a submittable action an agent can complete.",
                  "rec": null
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1200 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A contact route (ContactPoint, mailto or tel) is available for an agent to hand off.",
                  "rec": null
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "partial",
                  "weight": 1,
                  "detail": "An invisible reCAPTCHA v3 is present; it scores requests rather than blocking outright, but can still gate an action on a low score.",
                  "rec": "Do not gate primary actions behind an interactive CAPTCHA (hCaptcha, Turnstile, reCAPTCHA v2), which agents cannot solve. Invisible scoring (reCAPTCHA v3) is less hostile but can still block a low-scoring agent, so keep it off critical task paths."
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 10,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, Brand or Person entity in structured data.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "2 authoritative link(s) declared, but none resolved; dead links are not counted.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 10,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "3 extractable signals (statistics, figures, quotations, definitions) a model can lift and attribute.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No machine-readable entity (Organisation / Brand / Person)"
            },
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 2,
              "reachable": 2,
              "confirmed": 0,
              "dead": 0,
              "links": [
                {
                  "host": "linkedin.com",
                  "status": 200,
                  "state": "reachable"
                },
                {
                  "host": "en.wikipedia.org",
                  "status": 200,
                  "state": "reachable"
                }
              ],
              "scoringHosts": [],
              "confirmedHosts": [],
              "unverifiedHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": [
        "sameas-unverified"
      ]
    },
    {
      "name": "Network Rail",
      "domain": "networkrail.co.uk",
      "ok": true,
      "finalUrl": "https://www.networkrail.co.uk/",
      "offDomain": "networkrail.co.uk",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 72,
        "execution": 82,
        "representation": 43,
        "composite": 66
      },
      "detail": {
        "retrieval": {
          "score": 72,
          "band": "Partly legible",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 64,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "pass",
                  "weight": 2,
                  "detail": "Entity type declared: Organization.",
                  "rec": null
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "pass",
                  "weight": 2,
                  "detail": "5 distinct external profiles linked via sameAs.",
                  "rec": null
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "pass",
                  "weight": 1,
                  "detail": "BreadcrumbList schema present.",
                  "rec": null
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 57,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 valid JSON-LD block(s).",
                  "rec": null
                },
                {
                  "label": "Linked entity graph",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "Entities are linked with @graph / @id, and the page references its subject.",
                  "rec": null
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "pass",
                  "weight": 1,
                  "detail": "datePublished / dateModified present in structured data.",
                  "rec": null
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 67,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "13 of 17 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 H1, 3 H2, 6 H3.",
                  "rec": null
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 100,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 674 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 68 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 138 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No images to assess.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 87,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "partial",
                  "weight": 1,
                  "detail": "2/3 Open Graph tags plus a Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "Title likely truncated in results (over 65 characters)"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 82,
          "band": "Agent-operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 71,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "pass",
                  "weight": 2.5,
                  "detail": "A consequential action is described in schema.",
                  "rec": null
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 75,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "partial",
                  "weight": 2,
                  "detail": "No HTML form on this page, so an agent cannot complete a form-based task here.",
                  "rec": "Provide real <form> elements with a real action attribute, named inputs and <label>/aria-label, and no honeypot trap, so an agent can read and complete the task. Forms wired only in JavaScript are invisible to non-rendering agents."
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 674 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 43,
          "band": "Ambiguous identity",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 50,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "partial",
                  "weight": 2,
                  "detail": "Entity declared (Network Rail), but thin: no description; no knowsAbout / areaServed / founder detail.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Entity name is consistent across surfaces, but no legal identifier (company number, VAT, LEI) is declared.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 60,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "2 confirmed and 0 unverified authoritative home(s) (of 5 declared; the rest did not resolve): x.com, linkedin.com.",
                  "rec": null
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "Profile links are present, but no CONFIRMED authoritative registry (Wikidata, Companies House, OpenCorporates) anchors them.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 10,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "2 extractable signals (statistics, figures, quotations, definitions) a model can lift and attribute.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 5,
              "reachable": 5,
              "confirmed": 2,
              "dead": 0,
              "links": [
                {
                  "host": "facebook.com",
                  "status": 200,
                  "state": "reachable"
                },
                {
                  "host": "x.com",
                  "status": 200,
                  "state": "confirmed"
                },
                {
                  "host": "instagram.com",
                  "status": 200,
                  "state": "reachable"
                },
                {
                  "host": "linkedin.com",
                  "status": 200,
                  "state": "confirmed"
                },
                {
                  "host": "youtube.com",
                  "status": 200,
                  "state": "reachable"
                }
              ],
              "scoringHosts": [
                "x.com",
                "linkedin.com"
              ],
              "confirmedHosts": [
                "x.com",
                "linkedin.com"
              ],
              "unverifiedHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "Great Western Railway",
      "domain": "gwr.com",
      "ok": true,
      "finalUrl": "https://gwr.com/",
      "offDomain": "gwr.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 17,
        "execution": 34,
        "representation": 8,
        "composite": 20
      },
      "detail": {
        "retrieval": {
          "score": 17,
          "band": "Largely invisible to AI",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 3,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, LocalBusiness or Person markup found.",
                  "rec": "Declare an Organisation (or LocalBusiness / Person) entity in JSON-LD so AI engines can identify and attribute you by name."
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 0,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No JSON-LD found.",
                  "rec": "Add JSON-LD structured data; it is how a machine reads your facts rather than guessing them."
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 0,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No paragraph content found.",
                  "rec": "Write several concise, self-contained paragraphs (roughly 40 to 450 characters, at least eight words each) that each answer a real question, rather than long unbroken blocks or repeated one-liners."
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "1 H1, 0 H2, 0 H3.",
                  "rec": "Add H2/H3 subheadings; a flat page is hard for a model to segment and quote."
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 25,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "About 26 words of readable text.",
                  "rec": "Give models enough clean, standalone prose to quote. This measures depth, not quality; a focused page can be cited at lower length, but very thin pages rarely are."
                },
                {
                  "label": "Title quality",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No title tag found.",
                  "rec": "Add a descriptive title tag."
                },
                {
                  "label": "Meta description quality",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No meta description found.",
                  "rec": "Add a clear meta description."
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No images to assess.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No lists, landmarks or header tables found.",
                  "rec": "Use lists, <main>/<article> landmarks and tables with <th> headers; they help AI parsers isolate and extract your content cleanly."
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 65,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "No robots.txt is blocking AI crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No canonical link found.",
                  "rec": "Declare a canonical URL so engines consolidate signals on one address."
                },
                {
                  "label": "Sitemap",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "No sitemap found via robots.txt or /sitemap.xml.",
                  "rec": "Publish a sitemap.xml with lastmod dates and reference it in robots.txt."
                },
                {
                  "label": "Social / Open Graph",
                  "status": "fail",
                  "weight": 1,
                  "detail": "0/3 Open Graph tags, no Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "Missing title tag"
            },
            {
              "sev": "warning",
              "label": "Missing meta description"
            },
            {
              "sev": "warning",
              "label": "No canonical URL declared"
            },
            {
              "sev": "warning",
              "label": "Thin content (under 250 words)"
            },
            {
              "sev": "warning",
              "label": "No sitemap discoverable"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 34,
          "band": "Closed to agents",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 202; OAI-SearchBot 202, PerplexityBot 202, ClaudeBot 202, GPTBot 202).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No robots.txt is blocking retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 45,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "partial",
                  "weight": 2,
                  "detail": "No HTML form on this page, so an agent cannot complete a form-based task here.",
                  "rec": "Provide real <form> elements with a real action attribute, named inputs and <label>/aria-label, and no honeypot trap, so an agent can read and complete the task. Forms wired only in JavaScript are invisible to non-rendering agents."
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Very little static content (~26 words); agents that do not run JavaScript will see almost nothing.",
                  "rec": "Server-render or pre-render the primary content and controls. Agents and most crawlers do not execute JavaScript, so a client-rendered action surface is invisible to them."
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 25,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "No sitemap found via robots.txt or /sitemap.xml.",
                  "rec": "Publish a sitemap.xml and reference it in robots.txt so agents can enumerate your actionable pages."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            },
            {
              "sev": "error",
              "label": "Action surface appears client-side rendered; agents may see little"
            },
            {
              "sev": "warning",
              "label": "Reachable but nothing to operate (little content, no action, no form)"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 8,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, Brand or Person entity in structured data.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 0,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Few extractable, quotable claims; little for a model to cite back to you.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No usage terms found on the page (license, copyrightHolder, meta reservation), and the TDM reservation file (/.well-known/tdmrep.json) could not be read on this scan, so the declared-terms verdict is unmeasured rather than a definitive absence. (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No machine-readable entity (Organisation / Brand / Person)"
            },
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": true
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": [
        "tdmrep-unmeasured"
      ]
    },
    {
      "name": "LNER",
      "domain": "lner.co.uk",
      "ok": false,
      "reason": "BLOCKED (HTTP 403)",
      "wafVendor": ""
    },
    {
      "name": "Avanti West Coast",
      "domain": "avantiwestcoast.co.uk",
      "ok": true,
      "finalUrl": "https://www.avantiwestcoast.co.uk/",
      "offDomain": "avantiwestcoast.co.uk",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 57,
        "execution": 63,
        "representation": 34,
        "composite": 51
      },
      "detail": {
        "retrieval": {
          "score": 57,
          "band": "Partly legible",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 67,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "pass",
                  "weight": 2,
                  "detail": "Entity type declared: Organization.",
                  "rec": null
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "pass",
                  "weight": 2,
                  "detail": "3 distinct external profiles linked via sameAs.",
                  "rec": null
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Logo and contact details in structured data.",
                  "rec": null
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Your entity carries some descriptive depth.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 36,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "2 valid JSON-LD block(s).",
                  "rec": null
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "pass",
                  "weight": 1,
                  "detail": "datePublished / dateModified present in structured data.",
                  "rec": null
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 33,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "34 of 41 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "0 H1, 12 H2, 5 H3.",
                  "rec": "Use exactly one H1, then H2/H3 to structure the content a model parses."
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 100,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 2700 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 54 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 149 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 131 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 74,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "A sitemap exists but carries no lastmod dates.",
                  "rec": "Publish a sitemap.xml with lastmod dates and reference it in robots.txt."
                },
                {
                  "label": "Social / Open Graph",
                  "status": "fail",
                  "weight": 1,
                  "detail": "0/3 Open Graph tags, no Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No H1 heading on the page"
            },
            {
              "sev": "error",
              "label": "1 insecure HTTP resource on a secure page"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 63,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 80,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "partial",
                  "weight": 2,
                  "detail": "3 form(s) with named inputs, but no action attribute: submission is wired in JavaScript, so a non-rendering agent has no endpoint to post to.",
                  "rec": "Provide real <form> elements with a real action attribute, named inputs and <label>/aria-label, and no honeypot trap, so an agent can read and complete the task. Forms wired only in JavaScript are invisible to non-rendering agents."
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 2700 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A contact route (ContactPoint, mailto or tel) is available for an agent to hand off.",
                  "rec": null
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 34,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 50,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "partial",
                  "weight": 2,
                  "detail": "Entity declared (Avanti West Coast), but thin: no knowsAbout / areaServed / founder detail.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Entity name is consistent across surfaces, but no legal identifier (company number, VAT, LEI) is declared.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 30,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "1 confirmed and 0 unverified authoritative home(s) (of 3 declared; the rest did not resolve): twitter.com.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "Profile links are present, but no CONFIRMED authoritative registry (Wikidata, Companies House, OpenCorporates) anchors them.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 10,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "2 extractable signals (statistics, figures, quotations, definitions) a model can lift and attribute.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 3,
              "reachable": 3,
              "confirmed": 1,
              "dead": 0,
              "links": [
                {
                  "host": "twitter.com",
                  "status": 200,
                  "state": "confirmed"
                },
                {
                  "host": "instagram.com",
                  "status": 200,
                  "state": "reachable"
                },
                {
                  "host": "facebook.com",
                  "status": 200,
                  "state": "reachable"
                }
              ],
              "scoringHosts": [
                "twitter.com"
              ],
              "confirmedHosts": [
                "twitter.com"
              ],
              "unverifiedHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "CrossCountry",
      "domain": "crosscountrytrains.co.uk",
      "ok": false,
      "reason": "BLOCKED (HTTP 403)",
      "wafVendor": "Cloudflare"
    },
    {
      "name": "Southeastern",
      "domain": "southeasternrailway.co.uk",
      "ok": true,
      "finalUrl": "https://www.southeasternrailway.co.uk/",
      "offDomain": "southeasternrailway.co.uk",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 68,
        "execution": 69,
        "representation": 41,
        "composite": 59
      },
      "detail": {
        "retrieval": {
          "score": 68,
          "band": "Partly legible",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 67,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "pass",
                  "weight": 2,
                  "detail": "Entity type declared: Organization.",
                  "rec": null
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "pass",
                  "weight": 2,
                  "detail": "4 distinct external profiles linked via sameAs.",
                  "rec": null
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Logo and contact details in structured data.",
                  "rec": null
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Your entity carries some descriptive depth.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 21,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 valid JSON-LD block(s).",
                  "rec": null
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 67,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "12 of 40 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 H1, 17 H2, 7 H3.",
                  "rec": null
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 100,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1100 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 63 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 172 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 117 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 96,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "pass",
                  "weight": 1,
                  "detail": "3/3 Open Graph tags plus a Twitter card.",
                  "rec": null
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 69,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 100,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "pass",
                  "weight": 2,
                  "detail": "2 form(s) with named, labelled inputs and a submittable action an agent can complete.",
                  "rec": null
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1100 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A contact route (ContactPoint, mailto or tel) is available for an agent to hand off.",
                  "rec": null
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 41,
          "band": "Ambiguous identity",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 50,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "partial",
                  "weight": 2,
                  "detail": "Entity declared (Southeastern), but thin: no knowsAbout / areaServed / founder detail.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Entity name is consistent across surfaces, but no legal identifier (company number, VAT, LEI) is declared.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 60,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "2 confirmed and 0 unverified authoritative home(s) (of 4 declared; the rest did not resolve): twitter.com, linkedin.com.",
                  "rec": null
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "Profile links are present, but no CONFIRMED authoritative registry (Wikidata, Companies House, OpenCorporates) anchors them.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 0,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Few extractable, quotable claims; little for a model to cite back to you.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 4,
              "reachable": 4,
              "confirmed": 2,
              "dead": 0,
              "links": [
                {
                  "host": "twitter.com",
                  "status": 200,
                  "state": "confirmed"
                },
                {
                  "host": "facebook.com",
                  "status": 200,
                  "state": "reachable"
                },
                {
                  "host": "instagram.com",
                  "status": 200,
                  "state": "reachable"
                },
                {
                  "host": "linkedin.com",
                  "status": 200,
                  "state": "confirmed"
                }
              ],
              "scoringHosts": [
                "twitter.com",
                "linkedin.com"
              ],
              "confirmedHosts": [
                "twitter.com",
                "linkedin.com"
              ],
              "unverifiedHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "Southern",
      "domain": "southernrailway.com",
      "ok": false,
      "reason": "BLOCKED (HTTP 403)",
      "wafVendor": "Akamai"
    },
    {
      "name": "South Western Railway",
      "domain": "southwesternrailway.com",
      "ok": true,
      "finalUrl": "https://www.southwesternrailway.com/",
      "offDomain": "southwesternrailway.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 62,
        "execution": 82,
        "representation": 43,
        "composite": 62
      },
      "detail": {
        "retrieval": {
          "score": 62,
          "band": "Partly legible",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 53,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "pass",
                  "weight": 2,
                  "detail": "Entity type declared: Organization.",
                  "rec": null
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "pass",
                  "weight": 2,
                  "detail": "6 distinct external profiles linked via sameAs.",
                  "rec": null
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 32,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "2 valid JSON-LD block(s).",
                  "rec": null
                },
                {
                  "label": "Linked entity graph",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Uses @graph / @id, but the page does not reference a subject entity.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 50,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "20 of 55 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "2 H1, 5 H2, 13 H3.",
                  "rec": "Use exactly one H1, then H2/H3 to structure the content a model parses."
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 100,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 2200 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 61 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 132 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 47 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 96,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "pass",
                  "weight": 1,
                  "detail": "3/3 Open Graph tags plus a Twitter card.",
                  "rec": null
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "Multiple H1 headings (2)"
            },
            {
              "sev": "error",
              "label": "1 insecure HTTP resource on a secure page"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 82,
          "band": "Agent-operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 71,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "pass",
                  "weight": 2.5,
                  "detail": "A consequential action is described in schema.",
                  "rec": null
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 75,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "partial",
                  "weight": 2,
                  "detail": "1 form(s) with named inputs, but no action attribute: submission is wired in JavaScript, so a non-rendering agent has no endpoint to post to.",
                  "rec": "Provide real <form> elements with a real action attribute, named inputs and <label>/aria-label, and no honeypot trap, so an agent can read and complete the task. Forms wired only in JavaScript are invisible to non-rendering agents."
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 2200 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 43,
          "band": "Ambiguous identity",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 50,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "partial",
                  "weight": 2,
                  "detail": "Entity declared (South Western Railway), but thin: no description; no knowsAbout / areaServed / founder detail.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Entity name is consistent across surfaces, but no legal identifier (company number, VAT, LEI) is declared.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 60,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "2 confirmed and 0 unverified authoritative home(s) (of 6 declared; the rest did not resolve): twitter.com, linkedin.com.",
                  "rec": null
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "Profile links are present, but no CONFIRMED authoritative registry (Wikidata, Companies House, OpenCorporates) anchors them.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 10,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "4 extractable signals (statistics, figures, quotations, definitions) a model can lift and attribute.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 5,
              "reachable": 5,
              "confirmed": 2,
              "dead": 0,
              "links": [
                {
                  "host": "twitter.com",
                  "status": 200,
                  "state": "confirmed"
                },
                {
                  "host": "linkedin.com",
                  "status": 200,
                  "state": "confirmed"
                },
                {
                  "host": "facebook.com",
                  "status": 200,
                  "state": "reachable"
                },
                {
                  "host": "instagram.com",
                  "status": 200,
                  "state": "reachable"
                },
                {
                  "host": "youtube.com",
                  "status": 200,
                  "state": "reachable"
                }
              ],
              "scoringHosts": [
                "twitter.com",
                "linkedin.com"
              ],
              "confirmedHosts": [
                "twitter.com",
                "linkedin.com"
              ],
              "unverifiedHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "Northern",
      "domain": "northernrailway.co.uk",
      "ok": true,
      "finalUrl": "https://www.northernrailway.co.uk/",
      "offDomain": "northernrailway.co.uk",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 49,
        "execution": 56,
        "representation": 13,
        "composite": 39
      },
      "detail": {
        "retrieval": {
          "score": 49,
          "band": "Significant gaps",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 3,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, LocalBusiness or Person markup found.",
                  "rec": "Declare an Organisation (or LocalBusiness / Person) entity in JSON-LD so AI engines can identify and attribute you by name."
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 0,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No JSON-LD found.",
                  "rec": "Add JSON-LD structured data; it is how a machine reads your facts rather than guessing them."
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 67,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "12 of 16 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 H1, 4 H2, 4 H3.",
                  "rec": null
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 100,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1100 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 54 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 146 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 26 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 96,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "pass",
                  "weight": 1,
                  "detail": "3/3 Open Graph tags plus a Twitter card.",
                  "rec": null
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 56,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 63,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "partial",
                  "weight": 3,
                  "detail": "Could not establish a browser baseline (control returned 403); agent results inconclusive. Probed: OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 403.",
                  "rec": "Your CDN or WAF is refusing AI user-agents at the network layer, so the page is invisible to those agents regardless of robots.txt. If you intend to be agent-reachable, allow the retrieval user-agents (OAI-SearchBot, PerplexityBot, Claude-SearchBot) in your bot-management or Pay-Per-Crawl settings. Note: we test this by sending these user-agent strings from our scanner, so it measures how your edge treats the user-agent; a real agent presents the same string from its own network, making this a strong signal rather than a guarantee."
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 95,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "pass",
                  "weight": 2,
                  "detail": "3 form(s) with named, labelled inputs and a submittable action an agent can complete.",
                  "rec": null
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1100 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "Some AI agents refused at the edge (GPTBot)"
            },
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 13,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, Brand or Person entity in structured data.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 20,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "7 extractable signals (statistics, figures, quotations, definitions) a model can lift and attribute.",
                  "rec": null
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No usage terms found on the page (license, copyrightHolder, meta reservation), and the TDM reservation file (/.well-known/tdmrep.json) could not be read on this scan, so the declared-terms verdict is unmeasured rather than a definitive absence. (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No machine-readable entity (Organisation / Brand / Person)"
            },
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": true
        }
      },
      "serving": {
        "checked": false,
        "consistent": null,
        "note": "browser-ua-unreadable"
      },
      "flags": [
        "tdmrep-unmeasured"
      ]
    },
    {
      "name": "TransPennine Express",
      "domain": "tpexpress.co.uk",
      "ok": true,
      "finalUrl": "https://www.tpexpress.co.uk//",
      "offDomain": "tpexpress.co.uk",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 41,
        "execution": 62,
        "representation": 13,
        "composite": 39
      },
      "detail": {
        "retrieval": {
          "score": 41,
          "band": "Significant gaps",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 3,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, LocalBusiness or Person markup found.",
                  "rec": "Declare an Organisation (or LocalBusiness / Person) entity in JSON-LD so AI engines can identify and attribute you by name."
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 0,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No JSON-LD found.",
                  "rec": "Add JSON-LD structured data; it is how a machine reads your facts rather than guessing them."
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 50,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "12 of 37 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "1 H1, 1 H2, 13 H3.",
                  "rec": "Add H2/H3 subheadings; a flat page is hard for a model to segment and quote."
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 100,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1400 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 61 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 152 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 24 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 78,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "fail",
                  "weight": 1,
                  "detail": "0/3 Open Graph tags, no Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 62,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 75,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "partial",
                  "weight": 2,
                  "detail": "A form element is present but has no usable named inputs.",
                  "rec": "Provide real <form> elements with a real action attribute, named inputs and <label>/aria-label, and no honeypot trap, so an agent can read and complete the task. Forms wired only in JavaScript are invisible to non-rendering agents."
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1400 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 13,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, Brand or Person entity in structured data.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 20,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "6 extractable signals (statistics, figures, quotations, definitions) a model can lift and attribute.",
                  "rec": null
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No machine-readable entity (Organisation / Brand / Person)"
            },
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "East Midlands Railway",
      "domain": "eastmidlandsrailway.co.uk",
      "ok": false,
      "reason": "BLOCKED (HTTP 403)",
      "wafVendor": "Cloudflare"
    },
    {
      "name": "West Midlands Railway",
      "domain": "westmidlandsrailway.com",
      "ok": false,
      "reason": "UNREACHABLE (no response)",
      "wafVendor": ""
    },
    {
      "name": "Chiltern Railways",
      "domain": "chilternrailways.co.uk",
      "ok": true,
      "finalUrl": "https://www.chilternrailways.co.uk/",
      "offDomain": "chilternrailways.co.uk",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 34,
        "execution": 68,
        "representation": 13,
        "composite": 38
      },
      "detail": {
        "retrieval": {
          "score": 34,
          "band": "Largely invisible to AI",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 3,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, LocalBusiness or Person markup found.",
                  "rec": "Declare an Organisation (or LocalBusiness / Person) entity in JSON-LD so AI engines can identify and attribute you by name."
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 0,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No JSON-LD found.",
                  "rec": "Add JSON-LD structured data; it is how a machine reads your facts rather than guessing them."
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 33,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "10 of 19 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "0 H1, 4 H2, 17 H3.",
                  "rec": "Use exactly one H1, then H2/H3 to structure the content a model parses."
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 80,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 654 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 28 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No meta description found.",
                  "rec": "Add a clear meta description."
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 22 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 78,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "fail",
                  "weight": 1,
                  "detail": "0/3 Open Graph tags, no Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No H1 heading on the page"
            },
            {
              "sev": "error",
              "label": "1 insecure HTTP resource on a secure page"
            },
            {
              "sev": "warning",
              "label": "Missing meta description"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 68,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 95,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "pass",
                  "weight": 2,
                  "detail": "1 form(s) with named, labelled inputs and a submittable action an agent can complete.",
                  "rec": null
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 654 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 13,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, Brand or Person entity in structured data.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 20,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "11 extractable signals (statistics, figures, quotations, definitions) a model can lift and attribute.",
                  "rec": null
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No machine-readable entity (Organisation / Brand / Person)"
            },
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "c2c",
      "domain": "c2c-online.co.uk",
      "ok": true,
      "finalUrl": "https://www.c2c-online.co.uk/",
      "offDomain": "c2c-online.co.uk",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 84,
        "execution": 87,
        "representation": 44,
        "composite": 72
      },
      "detail": {
        "retrieval": {
          "score": 84,
          "band": "Well positioned",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 69,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "pass",
                  "weight": 2,
                  "detail": "Entity type declared: Organization, Person.",
                  "rec": null
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "pass",
                  "weight": 2,
                  "detail": "5 distinct external profiles linked via sameAs.",
                  "rec": null
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Author or person is named, but without credential depth.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "pass",
                  "weight": 1,
                  "detail": "BreadcrumbList schema present.",
                  "rec": null
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 79,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 valid JSON-LD block(s).",
                  "rec": null
                },
                {
                  "label": "Linked entity graph",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "Entities are linked with @graph / @id, and the page references its subject.",
                  "rec": null
                },
                {
                  "label": "Rich content types",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "Rich types present: Article.",
                  "rec": null
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "pass",
                  "weight": 1,
                  "detail": "datePublished / dateModified present in structured data.",
                  "rec": null
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 100,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "14 of 36 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "3 question-led heading(s) or Q&A found.",
                  "rec": null
                },
                {
                  "label": "Heading structure",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 H1, 9 H2, 6 H3.",
                  "rec": null
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 80,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1800 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 64 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 165 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "fail",
                  "weight": 1,
                  "detail": "47% of 49 images have alt text.",
                  "rec": "Give images descriptive alt text; it is readable context a model can use."
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 87,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "partial",
                  "weight": 1,
                  "detail": "2/3 Open Graph tags plus a Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "26 images missing alt text"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 87,
          "band": "Agent-operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 71,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "pass",
                  "weight": 2.5,
                  "detail": "A consequential action is described in schema.",
                  "rec": null
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 95,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "pass",
                  "weight": 2,
                  "detail": "3 form(s) with named, labelled inputs and a submittable action an agent can complete.",
                  "rec": null
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1800 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 44,
          "band": "Ambiguous identity",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 50,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "partial",
                  "weight": 2,
                  "detail": "Entity declared (c2c), but thin: no description; no knowsAbout / areaServed / founder detail.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Entity name is consistent across surfaces, but no legal identifier (company number, VAT, LEI) is declared.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 30,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "1 confirmed and 0 unverified authoritative home(s) (of 5 declared; the rest did not resolve): twitter.com.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "Profile links are present, but no CONFIRMED authoritative registry (Wikidata, Companies House, OpenCorporates) anchors them.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 50,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "A person or author is named, but without credential depth.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "19 extractable signals (statistics, figures, quotations, definitions) a model can lift and attribute.",
                  "rec": null
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 5,
              "reachable": 5,
              "confirmed": 1,
              "dead": 0,
              "links": [
                {
                  "host": "facebook.com",
                  "status": 200,
                  "state": "reachable"
                },
                {
                  "host": "twitter.com",
                  "status": 200,
                  "state": "confirmed"
                },
                {
                  "host": "instagram.com",
                  "status": 200,
                  "state": "reachable"
                },
                {
                  "host": "tiktok.com",
                  "status": 200,
                  "state": "reachable"
                },
                {
                  "host": "uk.linkedin.com",
                  "status": 200,
                  "state": "reachable"
                }
              ],
              "scoringHosts": [
                "twitter.com"
              ],
              "confirmedHosts": [
                "twitter.com"
              ],
              "unverifiedHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "Greater Anglia",
      "domain": "greateranglia.co.uk",
      "ok": false,
      "reason": "BLOCKED (HTTP 403)",
      "wafVendor": "Cloudflare"
    },
    {
      "name": "Merseyrail",
      "domain": "merseyrail.org",
      "ok": false,
      "reason": "BLOCKED (HTTP 403)",
      "wafVendor": "Cloudflare"
    },
    {
      "name": "ScotRail",
      "domain": "scotrail.co.uk",
      "ok": false,
      "reason": "BLOCKED (HTTP 403)",
      "wafVendor": "Cloudflare"
    },
    {
      "name": "Transport for Wales",
      "domain": "tfw.wales",
      "ok": true,
      "finalUrl": "https://tfw.wales/",
      "offDomain": "tfw.wales",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 47,
        "execution": 68,
        "representation": 10,
        "composite": 42
      },
      "detail": {
        "retrieval": {
          "score": 47,
          "band": "Significant gaps",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 3,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, LocalBusiness or Person markup found.",
                  "rec": "Declare an Organisation (or LocalBusiness / Person) entity in JSON-LD so AI engines can identify and attribute you by name."
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 0,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No JSON-LD found.",
                  "rec": "Add JSON-LD structured data; it is how a machine reads your facts rather than guessing them."
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 67,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "20 of 124 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 H1, 21 H2, 1 H3.",
                  "rec": null
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 100,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1400 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 61 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 133 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "94% of 35 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 87,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "partial",
                  "weight": 1,
                  "detail": "3/3 Open Graph tags, no Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "2 images missing alt text"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 68,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 95,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "pass",
                  "weight": 2,
                  "detail": "2 form(s) with named, labelled inputs and a submittable action an agent can complete.",
                  "rec": null
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1400 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 10,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, Brand or Person entity in structured data.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 10,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "4 extractable signals (statistics, figures, quotations, definitions) a model can lift and attribute.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No machine-readable entity (Organisation / Brand / Person)"
            },
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "Eurostar",
      "domain": "eurostar.com",
      "ok": true,
      "finalUrl": "https://www.eurostar.com/us-en",
      "offDomain": "eurostar.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 66,
        "execution": 63,
        "representation": 37,
        "composite": 55
      },
      "detail": {
        "retrieval": {
          "score": 66,
          "band": "Partly legible",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 53,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "pass",
                  "weight": 2,
                  "detail": "Entity type declared: Organization.",
                  "rec": null
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "pass",
                  "weight": 2,
                  "detail": "4 distinct external profiles linked via sameAs (8 links in total).",
                  "rec": null
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 32,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "2 valid JSON-LD block(s).",
                  "rec": null
                },
                {
                  "label": "Linked entity graph",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "The page references a subject, but the schema is otherwise flat.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 83,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "26 of 35 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "1 question-led heading(s) or Q&A found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 H1, 21 H2, 10 H3.",
                  "rec": null
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 100,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1200 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 52 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 146 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 30 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 74,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "A sitemap exists but carries no lastmod dates.",
                  "rec": "Publish a sitemap.xml with lastmod dates and reference it in robots.txt."
                },
                {
                  "label": "Social / Open Graph",
                  "status": "fail",
                  "weight": 1,
                  "detail": "1/3 Open Graph tags plus a Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 63,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 80,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "partial",
                  "weight": 2,
                  "detail": "9 form(s) with named inputs, but no action attribute: submission is wired in JavaScript, so a non-rendering agent has no endpoint to post to.",
                  "rec": "Provide real <form> elements with a real action attribute, named inputs and <label>/aria-label, and no honeypot trap, so an agent can read and complete the task. Forms wired only in JavaScript are invisible to non-rendering agents."
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1200 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A contact route (ContactPoint, mailto or tel) is available for an agent to hand off.",
                  "rec": null
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 37,
          "band": "Ambiguous identity",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 50,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "partial",
                  "weight": 2,
                  "detail": "Entity declared (Eurostar), but thin: no description; no knowsAbout / areaServed / founder detail.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Entity name is consistent across surfaces, but no legal identifier (company number, VAT, LEI) is declared.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 30,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "1 confirmed and 0 unverified authoritative home(s) (of 3 declared; the rest did not resolve): x.com.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "Profile links are present, but no CONFIRMED authoritative registry (Wikidata, Companies House, OpenCorporates) anchors them.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 20,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "11 extractable signals (statistics, figures, quotations, definitions) a model can lift and attribute.",
                  "rec": null
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 3,
              "reachable": 3,
              "confirmed": 1,
              "dead": 0,
              "links": [
                {
                  "host": "facebook.com",
                  "status": 200,
                  "state": "reachable"
                },
                {
                  "host": "x.com",
                  "status": 200,
                  "state": "confirmed"
                },
                {
                  "host": "instagram.com",
                  "status": 200,
                  "state": "reachable"
                }
              ],
              "scoringHosts": [
                "x.com"
              ],
              "confirmedHosts": [
                "x.com"
              ],
              "unverifiedHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "Transport for London",
      "domain": "tfl.gov.uk",
      "ok": false,
      "reason": "BLOCKED (HTTP 403)",
      "wafVendor": "Cloudflare"
    },
    {
      "name": "Freightliner",
      "domain": "freightliner.co.uk",
      "ok": false,
      "reason": "UNREACHABLE (no response)",
      "wafVendor": ""
    },
    {
      "name": "DB Cargo",
      "domain": "dbcargo.com",
      "ok": true,
      "finalUrl": "https://www.dbcargo.com/rail-de-de",
      "offDomain": "dbcargo.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 50,
        "execution": 68,
        "representation": 8,
        "composite": 42
      },
      "detail": {
        "retrieval": {
          "score": 50,
          "band": "Significant gaps",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 3,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, LocalBusiness or Person markup found.",
                  "rec": "Declare an Organisation (or LocalBusiness / Person) entity in JSON-LD so AI engines can identify and attribute you by name."
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 0,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No JSON-LD found.",
                  "rec": "Add JSON-LD structured data; it is how a machine reads your facts rather than guessing them."
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 83,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "11 of 20 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "3 question-led heading(s) or Q&A found.",
                  "rec": null
                },
                {
                  "label": "Heading structure",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "3 H1, 19 H2, 10 H3.",
                  "rec": "Use exactly one H1, then H2/H3 to structure the content a model parses."
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 90,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 950 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Title is 8 characters.",
                  "rec": "Aim for a 15 to 70 character title that states who you are and what you do."
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 166 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 44 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 83,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "A sitemap exists but carries no lastmod dates.",
                  "rec": "Publish a sitemap.xml with lastmod dates and reference it in robots.txt."
                },
                {
                  "label": "Social / Open Graph",
                  "status": "partial",
                  "weight": 1,
                  "detail": "3/3 Open Graph tags, no Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "Multiple H1 headings (3)"
            },
            {
              "sev": "error",
              "label": "1 insecure HTTP resource on a secure page"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 68,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 95,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "pass",
                  "weight": 2,
                  "detail": "1 form(s) with named, labelled inputs and a submittable action an agent can complete.",
                  "rec": null
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 950 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 8,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, Brand or Person entity in structured data.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 0,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Few extractable, quotable claims; little for a model to cite back to you.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No machine-readable entity (Organisation / Brand / Person)"
            },
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "GB Railfreight",
      "domain": "gbrailfreight.com",
      "ok": true,
      "finalUrl": "https://www.gbrailfreight.com/",
      "offDomain": "gbrailfreight.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 72,
        "execution": 80,
        "representation": 37,
        "composite": 63
      },
      "detail": {
        "retrieval": {
          "score": 72,
          "band": "Partly legible",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 53,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "pass",
                  "weight": 2,
                  "detail": "Entity type declared: Organization.",
                  "rec": null
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "partial",
                  "weight": 2,
                  "detail": "2 distinct external profiles linked via sameAs.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "pass",
                  "weight": 1,
                  "detail": "BreadcrumbList schema present.",
                  "rec": null
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 57,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 valid JSON-LD block(s).",
                  "rec": null
                },
                {
                  "label": "Linked entity graph",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "Entities are linked with @graph / @id, and the page references its subject.",
                  "rec": null
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "pass",
                  "weight": 1,
                  "detail": "datePublished / dateModified present in structured data.",
                  "rec": null
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 100,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "17 of 42 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "4 question-led heading(s) or Q&A found.",
                  "rec": null
                },
                {
                  "label": "Heading structure",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 H1, 14 H2, 4 H3.",
                  "rec": null
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 60,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 3200 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 21 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No meta description found.",
                  "rec": "Add a clear meta description."
                },
                {
                  "label": "Image alt coverage",
                  "status": "fail",
                  "weight": 1,
                  "detail": "1% of 283 images have alt text.",
                  "rec": "Give images descriptive alt text; it is readable context a model can use."
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 78,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "fail",
                  "weight": 1,
                  "detail": "1/3 Open Graph tags plus a Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "280 images missing alt text"
            },
            {
              "sev": "warning",
              "label": "Missing meta description"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 80,
          "band": "Agent-operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 429, GPTBot 200). 1 probe(s) returned a transient rate-limit or timeout and are not counted as a block.",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 71,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "pass",
                  "weight": 2.5,
                  "detail": "A consequential action is described in schema.",
                  "rec": null
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 70,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "partial",
                  "weight": 2,
                  "detail": "No HTML form on this page, so an agent cannot complete a form-based task here.",
                  "rec": "Provide real <form> elements with a real action attribute, named inputs and <label>/aria-label, and no honeypot trap, so an agent can read and complete the task. Forms wired only in JavaScript are invisible to non-rendering agents."
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 3200 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A contact route (ContactPoint, mailto or tel) is available for an agent to hand off.",
                  "rec": null
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "partial",
                  "weight": 1,
                  "detail": "An invisible reCAPTCHA v3 is present; it scores requests rather than blocking outright, but can still gate an action on a low score.",
                  "rec": "Do not gate primary actions behind an interactive CAPTCHA (hCaptcha, Turnstile, reCAPTCHA v2), which agents cannot solve. Invisible scoring (reCAPTCHA v3) is less hostile but can still block a low-scoring agent, so keep it off critical task paths."
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 37,
          "band": "Ambiguous identity",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 50,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "partial",
                  "weight": 2,
                  "detail": "Entity declared (GBRf), but thin: no description; no knowsAbout / areaServed / founder detail.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Entity name is consistent across surfaces, but no legal identifier (company number, VAT, LEI) is declared.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 30,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "1 confirmed and 0 unverified authoritative home(s) (of 2 declared; the rest did not resolve): x.com.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "Profile links are present, but no CONFIRMED authoritative registry (Wikidata, Companies House, OpenCorporates) anchors them.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 20,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "18 extractable signals (statistics, figures, quotations, definitions) a model can lift and attribute.",
                  "rec": null
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 2,
              "reachable": 2,
              "confirmed": 1,
              "dead": 0,
              "links": [
                {
                  "host": "facebook.com",
                  "status": 200,
                  "state": "reachable"
                },
                {
                  "host": "x.com",
                  "status": 200,
                  "state": "confirmed"
                }
              ],
              "scoringHosts": [
                "x.com"
              ],
              "confirmedHosts": [
                "x.com"
              ],
              "unverifiedHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "Deutsche Bahn",
      "domain": "bahn.com",
      "ok": true,
      "finalUrl": "https://int.bahn.de/",
      "offDomain": "int.bahn.de",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 25,
        "execution": 34,
        "representation": 8,
        "composite": 22
      },
      "detail": {
        "retrieval": {
          "score": 25,
          "band": "Largely invisible to AI",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 3,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, LocalBusiness or Person markup found.",
                  "rec": "Declare an Organisation (or LocalBusiness / Person) entity in JSON-LD so AI engines can identify and attribute you by name."
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 0,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No JSON-LD found.",
                  "rec": "Add JSON-LD structured data; it is how a machine reads your facts rather than guessing them."
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 17,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "2 of 2 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": "Write several concise, self-contained paragraphs (roughly 40 to 450 characters, at least eight words each) that each answer a real question, rather than long unbroken blocks or repeated one-liners."
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "1 H1, 0 H2, 0 H3.",
                  "rec": "Add H2/H3 subheadings; a flat page is hard for a model to segment and quote."
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 40,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "About 90 words of readable text.",
                  "rec": "Give models enough clean, standalone prose to quote. This measures depth, not quality; a focused page can be cited at lower length, but very thin pages rarely are."
                },
                {
                  "label": "Title quality",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Title is 73 characters.",
                  "rec": "Aim for a 15 to 70 character title that states who you are and what you do."
                },
                {
                  "label": "Meta description quality",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No meta description found.",
                  "rec": "Add a clear meta description."
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 3 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 78,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "No sitemap found via robots.txt or /sitemap.xml.",
                  "rec": "Publish a sitemap.xml with lastmod dates and reference it in robots.txt."
                },
                {
                  "label": "Social / Open Graph",
                  "status": "partial",
                  "weight": 1,
                  "detail": "2/3 Open Graph tags plus a Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "Title likely truncated in results (over 65 characters)"
            },
            {
              "sev": "warning",
              "label": "Missing meta description"
            },
            {
              "sev": "warning",
              "label": "Thin content (under 250 words)"
            },
            {
              "sev": "warning",
              "label": "No sitemap discoverable"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 34,
          "band": "Closed to agents",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 45,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "partial",
                  "weight": 2,
                  "detail": "No HTML form on this page, so an agent cannot complete a form-based task here.",
                  "rec": "Provide real <form> elements with a real action attribute, named inputs and <label>/aria-label, and no honeypot trap, so an agent can read and complete the task. Forms wired only in JavaScript are invisible to non-rendering agents."
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Very little static content (~90 words); agents that do not run JavaScript will see almost nothing.",
                  "rec": "Server-render or pre-render the primary content and controls. Agents and most crawlers do not execute JavaScript, so a client-rendered action surface is invisible to them."
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 25,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "No sitemap found via robots.txt or /sitemap.xml.",
                  "rec": "Publish a sitemap.xml and reference it in robots.txt so agents can enumerate your actionable pages."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            },
            {
              "sev": "error",
              "label": "Action surface appears client-side rendered; agents may see little"
            },
            {
              "sev": "warning",
              "label": "Reachable but nothing to operate (little content, no action, no form)"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 8,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, Brand or Person entity in structured data.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 0,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Few extractable, quotable claims; little for a model to cite back to you.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No machine-readable entity (Organisation / Brand / Person)"
            },
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "SNCF",
      "domain": "sncf.com",
      "ok": false,
      "reason": "BLOCKED (HTTP 403)",
      "wafVendor": "Cloudflare"
    },
    {
      "name": "Renfe",
      "domain": "renfe.com",
      "ok": true,
      "finalUrl": "https://www.renfe.com/es/en",
      "offDomain": "renfe.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 44,
        "execution": 50,
        "representation": 15,
        "composite": 36
      },
      "detail": {
        "retrieval": {
          "score": 44,
          "band": "Significant gaps",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 3,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, LocalBusiness or Person markup found.",
                  "rec": "Declare an Organisation (or LocalBusiness / Person) entity in JSON-LD so AI engines can identify and attribute you by name."
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 0,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No JSON-LD found.",
                  "rec": "Add JSON-LD structured data; it is how a machine reads your facts rather than guessing them."
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 50,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "10 of 10 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "1 question-led heading(s) or Q&A found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "0 H1, 1 H2, 3 H3.",
                  "rec": "Use exactly one H1, then H2/H3 to structure the content a model parses."
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 95,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1500 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 63 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 122 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No images to assess.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No lists, landmarks or header tables found.",
                  "rec": "Use lists, <main>/<article> landmarks and tables with <th> headers; they help AI parsers isolate and extract your content cleanly."
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 96,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "pass",
                  "weight": 1,
                  "detail": "3/3 Open Graph tags plus a Twitter card.",
                  "rec": null
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No H1 heading on the page"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 50,
          "band": "Major friction",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 63,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "partial",
                  "weight": 3,
                  "detail": "Some AI agents are refused at the edge while a browser gets 200 (OAI-SearchBot 200, PerplexityBot 403, ClaudeBot 403, GPTBot 200).",
                  "rec": "Your CDN or WAF is refusing AI user-agents at the network layer, so the page is invisible to those agents regardless of robots.txt. If you intend to be agent-reachable, allow the retrieval user-agents (OAI-SearchBot, PerplexityBot, Claude-SearchBot) in your bot-management or Pay-Per-Crawl settings. Note: we test this by sending these user-agent strings from our scanner, so it measures how your edge treats the user-agent; a real agent presents the same string from its own network, making this a strong signal rather than a guarantee."
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 75,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "partial",
                  "weight": 2,
                  "detail": "No HTML form on this page, so an agent cannot complete a form-based task here.",
                  "rec": "Provide real <form> elements with a real action attribute, named inputs and <label>/aria-label, and no honeypot trap, so an agent can read and complete the task. Forms wired only in JavaScript are invisible to non-rendering agents."
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1500 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "Some AI agents refused at the edge (PerplexityBot, ClaudeBot)"
            },
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 15,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, Brand or Person entity in structured data.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 0,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Few extractable, quotable claims; little for a model to cite back to you.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 100,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "pass",
                  "weight": 1,
                  "detail": "You actively govern representation: TDM reservation. (no training opt-out declared.)",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No machine-readable entity (Organisation / Brand / Person)"
            },
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "Trenitalia",
      "domain": "trenitalia.com",
      "ok": true,
      "finalUrl": "https://www.trenitalia.com/it.html",
      "offDomain": "trenitalia.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 39,
        "execution": 62,
        "representation": 13,
        "composite": 38
      },
      "detail": {
        "retrieval": {
          "score": 39,
          "band": "Significant gaps",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 3,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, LocalBusiness or Person markup found.",
                  "rec": "Declare an Organisation (or LocalBusiness / Person) entity in JSON-LD so AI engines can identify and attribute you by name."
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 0,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No JSON-LD found.",
                  "rec": "Add JSON-LD structured data; it is how a machine reads your facts rather than guessing them."
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 33,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "41 of 103 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "0 H1, 13 H2, 4 H3.",
                  "rec": "Use exactly one H1, then H2/H3 to structure the content a model parses."
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 100,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 5100 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 28 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 127 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 110 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 91,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "A sitemap exists but carries no lastmod dates.",
                  "rec": "Publish a sitemap.xml with lastmod dates and reference it in robots.txt."
                },
                {
                  "label": "Social / Open Graph",
                  "status": "pass",
                  "weight": 1,
                  "detail": "3/3 Open Graph tags plus a Twitter card.",
                  "rec": null
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No H1 heading on the page"
            },
            {
              "sev": "error",
              "label": "20 insecure HTTP resources on a secure page"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 62,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 75,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "partial",
                  "weight": 2,
                  "detail": "4 form(s) present, but an anti-bot honeypot field is likely to reject an autonomous submission.",
                  "rec": "Provide real <form> elements with a real action attribute, named inputs and <label>/aria-label, and no honeypot trap, so an agent can read and complete the task. Forms wired only in JavaScript are invisible to non-rendering agents."
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 5100 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 13,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, Brand or Person entity in structured data.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 20,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "33 extractable signals (statistics, figures, quotations, definitions) a model can lift and attribute.",
                  "rec": null
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No machine-readable entity (Organisation / Brand / Person)"
            },
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "SBB",
      "domain": "sbb.ch",
      "ok": false,
      "reason": "BLOCKED (HTTP 503)",
      "wafVendor": ""
    },
    {
      "name": "ÖBB",
      "domain": "oebb.at",
      "ok": true,
      "finalUrl": "https://www.oebb.at/",
      "offDomain": "oebb.at",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 40,
        "execution": 62,
        "representation": 10,
        "composite": 37
      },
      "detail": {
        "retrieval": {
          "score": 40,
          "band": "Significant gaps",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 3,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, LocalBusiness or Person markup found.",
                  "rec": "Declare an Organisation (or LocalBusiness / Person) entity in JSON-LD so AI engines can identify and attribute you by name."
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 0,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No JSON-LD found.",
                  "rec": "Add JSON-LD structured data; it is how a machine reads your facts rather than guessing them."
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 50,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "9 of 22 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "2 H1, 7 H2, 13 H3.",
                  "rec": "Use exactly one H1, then H2/H3 to structure the content a model parses."
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 80,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1100 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 16 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No meta description found.",
                  "rec": "Add a clear meta description."
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 76 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 83,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "No robots.txt is blocking AI crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "A sitemap exists but carries no lastmod dates.",
                  "rec": "Publish a sitemap.xml with lastmod dates and reference it in robots.txt."
                },
                {
                  "label": "Social / Open Graph",
                  "status": "partial",
                  "weight": 1,
                  "detail": "3/3 Open Graph tags, no Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "Multiple H1 headings (2)"
            },
            {
              "sev": "warning",
              "label": "Missing meta description"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 62,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No robots.txt is blocking retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 75,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "partial",
                  "weight": 2,
                  "detail": "No HTML form on this page, so an agent cannot complete a form-based task here.",
                  "rec": "Provide real <form> elements with a real action attribute, named inputs and <label>/aria-label, and no honeypot trap, so an agent can read and complete the task. Forms wired only in JavaScript are invisible to non-rendering agents."
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1100 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 10,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, Brand or Person entity in structured data.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 10,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "3 extractable signals (statistics, figures, quotations, definitions) a model can lift and attribute.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No machine-readable entity (Organisation / Brand / Person)"
            },
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "Nederlandse Spoorwegen",
      "domain": "ns.nl",
      "ok": true,
      "finalUrl": "https://www.ns.nl/",
      "offDomain": "ns.nl",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 54,
        "execution": 68,
        "representation": 13,
        "composite": 45
      },
      "detail": {
        "retrieval": {
          "score": 54,
          "band": "Significant gaps",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 3,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, LocalBusiness or Person markup found.",
                  "rec": "Declare an Organisation (or LocalBusiness / Person) entity in JSON-LD so AI engines can identify and attribute you by name."
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 11,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "1 JSON-LD block(s), but 1 failed to parse.",
                  "rec": "Fix the malformed JSON-LD; invalid blocks are ignored or distrusted."
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 83,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "6 of 13 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "1 question-led heading(s) or Q&A found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 H1, 2 H2, 38 H3.",
                  "rec": null
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 100,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 774 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 45 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 140 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 7 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 87,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "partial",
                  "weight": 1,
                  "detail": "3/3 Open Graph tags, no Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "1 invalid structured-data block"
            },
            {
              "sev": "error",
              "label": "1 insecure HTTP resource on a secure page"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 68,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 95,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "pass",
                  "weight": 2,
                  "detail": "1 form(s) with named, labelled inputs and a submittable action an agent can complete.",
                  "rec": null
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 774 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 13,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, Brand or Person entity in structured data.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 20,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "6 extractable signals (statistics, figures, quotations, definitions) a model can lift and attribute.",
                  "rec": null
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No machine-readable entity (Organisation / Brand / Person)"
            },
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "Amtrak",
      "domain": "amtrak.com",
      "ok": true,
      "finalUrl": "https://www.amtrak.com/home",
      "offDomain": "amtrak.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 54,
        "execution": 50,
        "representation": 10,
        "composite": 38
      },
      "detail": {
        "retrieval": {
          "score": 54,
          "band": "Significant gaps",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 3,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, LocalBusiness or Person markup found.",
                  "rec": "Declare an Organisation (or LocalBusiness / Person) entity in JSON-LD so AI engines can identify and attribute you by name."
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 0,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No JSON-LD found.",
                  "rec": "Add JSON-LD structured data; it is how a machine reads your facts rather than guessing them."
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 100,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "30 of 55 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "3 question-led heading(s) or Q&A found.",
                  "rec": null
                },
                {
                  "label": "Heading structure",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 H1, 25 H2, 14 H3.",
                  "rec": null
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 80,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 5800 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 46 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 126 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "fail",
                  "weight": 1,
                  "detail": "48% of 25 images have alt text.",
                  "rec": "Give images descriptive alt text; it is readable context a model can use."
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 87,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "partial",
                  "weight": 1,
                  "detail": "3/3 Open Graph tags, no Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "13 images missing alt text"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 50,
          "band": "Major friction",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 63,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "partial",
                  "weight": 3,
                  "detail": "Could not establish a browser baseline (control returned timeout); agent results inconclusive. Probed: OAI-SearchBot 200, PerplexityBot timeout, ClaudeBot timeout, GPTBot 200.",
                  "rec": "Your CDN or WAF is refusing AI user-agents at the network layer, so the page is invisible to those agents regardless of robots.txt. If you intend to be agent-reachable, allow the retrieval user-agents (OAI-SearchBot, PerplexityBot, Claude-SearchBot) in your bot-management or Pay-Per-Crawl settings. Note: we test this by sending these user-agent strings from our scanner, so it measures how your edge treats the user-agent; a real agent presents the same string from its own network, making this a strong signal rather than a guarantee."
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 75,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "pass",
                  "weight": 2,
                  "detail": "10 form(s) with named, labelled inputs and a submittable action an agent can complete.",
                  "rec": null
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 5800 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "fail",
                  "weight": 1,
                  "detail": "An interactive CAPTCHA (hCaptcha, Cloudflare Turnstile or reCAPTCHA v2) is present; autonomous agents cannot pass it.",
                  "rec": "Do not gate primary actions behind an interactive CAPTCHA (hCaptcha, Turnstile, reCAPTCHA v2), which agents cannot solve. Invisible scoring (reCAPTCHA v3) is less hostile but can still block a low-scoring agent, so keep it off critical task paths."
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            },
            {
              "sev": "warning",
              "label": "Interactive CAPTCHA present; autonomous agents cannot complete it"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 10,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, Brand or Person entity in structured data.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 10,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "2 extractable signals (statistics, figures, quotations, definitions) a model can lift and attribute.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No machine-readable entity (Organisation / Brand / Person)"
            },
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": false,
        "consistent": null,
        "note": "browser-ua-unreadable"
      },
      "flags": []
    },
    {
      "name": "Union Pacific",
      "domain": "up.com",
      "ok": false,
      "reason": "UNREACHABLE (no response)",
      "wafVendor": ""
    },
    {
      "name": "BNSF Railway",
      "domain": "bnsf.com",
      "ok": true,
      "finalUrl": "https://bnsf.com/",
      "offDomain": "bnsf.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 50,
        "execution": 62,
        "representation": 8,
        "composite": 40
      },
      "detail": {
        "retrieval": {
          "score": 50,
          "band": "Significant gaps",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 3,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, LocalBusiness or Person markup found.",
                  "rec": "Declare an Organisation (or LocalBusiness / Person) entity in JSON-LD so AI engines can identify and attribute you by name."
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 0,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No JSON-LD found.",
                  "rec": "Add JSON-LD structured data; it is how a machine reads your facts rather than guessing them."
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 100,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "61 of 67 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "5 question-led heading(s) or Q&A found.",
                  "rec": null
                },
                {
                  "label": "Heading structure",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 H1, 62 H2, 38 H3.",
                  "rec": null
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 90,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 2600 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Title is 12 characters.",
                  "rec": "Aim for a 15 to 70 character title that states who you are and what you do."
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 154 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "93% of 14 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 63,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No canonical link found.",
                  "rec": "Declare a canonical URL so engines consolidate signals on one address."
                },
                {
                  "label": "Sitemap",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "A sitemap exists but carries no lastmod dates.",
                  "rec": "Publish a sitemap.xml with lastmod dates and reference it in robots.txt."
                },
                {
                  "label": "Social / Open Graph",
                  "status": "fail",
                  "weight": 1,
                  "detail": "0/3 Open Graph tags plus a Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "partial",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, no lang.",
                  "rec": "Serve over HTTPS, add a responsive viewport meta tag, and set an html lang attribute."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "1 insecure HTTP resource on a secure page"
            },
            {
              "sev": "warning",
              "label": "1 image missing alt text"
            },
            {
              "sev": "warning",
              "label": "No canonical URL declared"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 62,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 75,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "partial",
                  "weight": 2,
                  "detail": "1 form(s) present, but inputs are poorly labelled.",
                  "rec": "Provide real <form> elements with a real action attribute, named inputs and <label>/aria-label, and no honeypot trap, so an agent can read and complete the task. Forms wired only in JavaScript are invisible to non-rendering agents."
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 2600 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 8,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, Brand or Person entity in structured data.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 0,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Few extractable, quotable claims; little for a model to cite back to you.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No machine-readable entity (Organisation / Brand / Person)"
            },
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "CSX",
      "domain": "csx.com",
      "ok": false,
      "reason": "BLOCKED (HTTP 403)",
      "wafVendor": "Cloudflare"
    },
    {
      "name": "Norfolk Southern",
      "domain": "norfolksouthern.com",
      "ok": true,
      "finalUrl": "https://norfolksouthern.com/",
      "offDomain": "norfolksouthern.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 51,
        "execution": 63,
        "representation": 18,
        "composite": 44
      },
      "detail": {
        "retrieval": {
          "score": 51,
          "band": "Significant gaps",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 3,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, LocalBusiness or Person markup found.",
                  "rec": "Declare an Organisation (or LocalBusiness / Person) entity in JSON-LD so AI engines can identify and attribute you by name."
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 0,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No JSON-LD found.",
                  "rec": "Add JSON-LD structured data; it is how a machine reads your facts rather than guessing them."
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 83,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "25 of 54 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "3 question-led heading(s) or Q&A found.",
                  "rec": null
                },
                {
                  "label": "Heading structure",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "4 H1, 13 H2, 20 H3.",
                  "rec": "Use exactly one H1, then H2/H3 to structure the content a model parses."
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 100,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1900 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 21 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 164 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 24 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 83,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "A sitemap exists but carries no lastmod dates.",
                  "rec": "Publish a sitemap.xml with lastmod dates and reference it in robots.txt."
                },
                {
                  "label": "Social / Open Graph",
                  "status": "partial",
                  "weight": 1,
                  "detail": "3/3 Open Graph tags, no Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "Multiple H1 headings (4)"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 63,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 80,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "partial",
                  "weight": 2,
                  "detail": "No HTML form on this page, so an agent cannot complete a form-based task here.",
                  "rec": "Provide real <form> elements with a real action attribute, named inputs and <label>/aria-label, and no honeypot trap, so an agent can read and complete the task. Forms wired only in JavaScript are invisible to non-rendering agents."
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1900 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A contact route (ContactPoint, mailto or tel) is available for an agent to hand off.",
                  "rec": null
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "llms.txt present but declares no transactional surfaces.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 18,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, Brand or Person entity in structured data.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 10,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "3 extractable signals (statistics, figures, quotations, definitions) a model can lift and attribute.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 100,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "pass",
                  "weight": 1,
                  "detail": "You actively govern representation: TDM reservation. (no training opt-out declared.)",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No machine-readable entity (Organisation / Brand / Person)"
            },
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "Canadian National Railway",
      "domain": "cn.ca",
      "ok": true,
      "finalUrl": "https://www.cn.ca/en/",
      "offDomain": "cn.ca",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 42,
        "execution": 63,
        "representation": 46,
        "composite": 50
      },
      "detail": {
        "retrieval": {
          "score": 42,
          "band": "Significant gaps",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 58,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "pass",
                  "weight": 2,
                  "detail": "Entity type declared: Organization.",
                  "rec": null
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "pass",
                  "weight": 2,
                  "detail": "3 distinct external profiles linked via sameAs.",
                  "rec": null
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Logo and contact details in structured data.",
                  "rec": null
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 21,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "3 valid JSON-LD block(s).",
                  "rec": null
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 0,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "0 of 5 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": "Write several concise, self-contained paragraphs (roughly 40 to 450 characters, at least eight words each) that each answer a real question, rather than long unbroken blocks or repeated one-liners."
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "0 H1, 1 H2, 1 H3.",
                  "rec": "Use exactly one H1, then H2/H3 to structure the content a model parses."
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 70,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1700 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Title is 112 characters.",
                  "rec": "Aim for a 15 to 70 character title that states who you are and what you do."
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 157 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "fail",
                  "weight": 1,
                  "detail": "56% of 27 images have alt text.",
                  "rec": "Give images descriptive alt text; it is readable context a model can use."
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 83,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "A sitemap is referenced but its file could not be read on this scan, so its lastmod freshness is unmeasured.",
                  "rec": "Publish a sitemap.xml with lastmod dates and reference it in robots.txt."
                },
                {
                  "label": "Social / Open Graph",
                  "status": "partial",
                  "weight": 1,
                  "detail": "3/3 Open Graph tags, no Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No H1 heading on the page"
            },
            {
              "sev": "warning",
              "label": "12 images missing alt text"
            },
            {
              "sev": "warning",
              "label": "Title likely truncated in results (over 65 characters)"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 63,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 80,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "partial",
                  "weight": 2,
                  "detail": "3 form(s) present, but inputs are poorly labelled.",
                  "rec": "Provide real <form> elements with a real action attribute, named inputs and <label>/aria-label, and no honeypot trap, so an agent can read and complete the task. Forms wired only in JavaScript are invisible to non-rendering agents."
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1700 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A contact route (ContactPoint, mailto or tel) is available for an agent to hand off.",
                  "rec": null
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 46,
          "band": "Ambiguous identity",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 50,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "partial",
                  "weight": 2,
                  "detail": "Entity declared (Canadian National), but thin: no description; no knowsAbout / areaServed / founder detail.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Entity name \"Canadian National\" is not clearly echoed in the title or og:site_name, which weakens disambiguation.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 60,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "2 confirmed and 0 unverified authoritative home(s) (of 3 declared; the rest did not resolve): linkedin.com, twitter.com.",
                  "rec": null
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "Profile links are present, but no CONFIRMED authoritative registry (Wikidata, Companies House, OpenCorporates) anchors them.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 20,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "17 extractable signals (statistics, figures, quotations, definitions) a model can lift and attribute.",
                  "rec": null
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 3,
              "reachable": 3,
              "confirmed": 2,
              "dead": 0,
              "links": [
                {
                  "host": "facebook.com",
                  "status": 200,
                  "state": "reachable"
                },
                {
                  "host": "linkedin.com",
                  "status": 200,
                  "state": "confirmed"
                },
                {
                  "host": "twitter.com",
                  "status": 200,
                  "state": "confirmed"
                }
              ],
              "scoringHosts": [
                "linkedin.com",
                "twitter.com"
              ],
              "confirmedHosts": [
                "linkedin.com",
                "twitter.com"
              ],
              "unverifiedHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "Canadian Pacific Kansas City",
      "domain": "cpkcr.com",
      "ok": false,
      "reason": "UNREADABLE (no content / client-side rendered)",
      "wafVendor": ""
    },
    {
      "name": "Aurizon",
      "domain": "aurizon.com.au",
      "ok": true,
      "finalUrl": "https://aurizon.com.au/",
      "offDomain": "aurizon.com.au",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 42,
        "execution": 65,
        "representation": 10,
        "composite": 39
      },
      "detail": {
        "retrieval": {
          "score": 42,
          "band": "Significant gaps",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 3,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, LocalBusiness or Person markup found.",
                  "rec": "Declare an Organisation (or LocalBusiness / Person) entity in JSON-LD so AI engines can identify and attribute you by name."
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 0,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No JSON-LD found.",
                  "rec": "Add JSON-LD structured data; it is how a machine reads your facts rather than guessing them."
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 50,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "2 of 2 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": "Write several concise, self-contained paragraphs (roughly 40 to 450 characters, at least eight words each) that each answer a real question, rather than long unbroken blocks or repeated one-liners."
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 H1, 4 H2, 0 H3.",
                  "rec": null
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 90,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 753 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 55 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Meta description is 234 characters.",
                  "rec": "Aim for a 70 to 180 character description; it is often quoted verbatim as your summary."
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 29 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 87,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "partial",
                  "weight": 1,
                  "detail": "2/3 Open Graph tags, no Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "Meta description over 180 characters"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 65,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 85,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "pass",
                  "weight": 2,
                  "detail": "1 form(s) with named, labelled inputs and a submittable action an agent can complete.",
                  "rec": null
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 753 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "partial",
                  "weight": 1,
                  "detail": "An invisible reCAPTCHA v3 is present; it scores requests rather than blocking outright, but can still gate an action on a low score.",
                  "rec": "Do not gate primary actions behind an interactive CAPTCHA (hCaptcha, Turnstile, reCAPTCHA v2), which agents cannot solve. Invisible scoring (reCAPTCHA v3) is less hostile but can still block a low-scoring agent, so keep it off critical task paths."
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 10,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, Brand or Person entity in structured data.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 10,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "3 extractable signals (statistics, figures, quotations, definitions) a model can lift and attribute.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No machine-readable entity (Organisation / Brand / Person)"
            },
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "East Japan Railway",
      "domain": "jreast.co.jp",
      "ok": false,
      "reason": "UNREACHABLE (no response)",
      "wafVendor": ""
    },
    {
      "name": "MTR Corporation",
      "domain": "mtr.com.hk",
      "ok": false,
      "reason": "UNREADABLE (no content / client-side rendered)",
      "wafVendor": ""
    },
    {
      "name": "National Express",
      "domain": "nationalexpress.com",
      "ok": true,
      "finalUrl": "https://www.nationalexpress.com/en",
      "offDomain": "nationalexpress.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 42,
        "execution": 68,
        "representation": 13,
        "composite": 41
      },
      "detail": {
        "retrieval": {
          "score": 42,
          "band": "Significant gaps",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 3,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, LocalBusiness or Person markup found.",
                  "rec": "Declare an Organisation (or LocalBusiness / Person) entity in JSON-LD so AI engines can identify and attribute you by name."
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 0,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No JSON-LD found.",
                  "rec": "Add JSON-LD structured data; it is how a machine reads your facts rather than guessing them."
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 50,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "14 of 38 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "1 H1, 0 H2, 3 H3.",
                  "rec": "Add H2/H3 subheadings; a flat page is hard for a model to segment and quote."
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 100,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1300 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 58 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 147 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "95% of 76 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 83,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "A sitemap exists but carries no lastmod dates.",
                  "rec": "Publish a sitemap.xml with lastmod dates and reference it in robots.txt."
                },
                {
                  "label": "Social / Open Graph",
                  "status": "partial",
                  "weight": 1,
                  "detail": "2/3 Open Graph tags, no Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "Heading levels skip from H1 to H3"
            },
            {
              "sev": "error",
              "label": "1 insecure HTTP resource on a secure page"
            },
            {
              "sev": "warning",
              "label": "4 images missing alt text"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 68,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 95,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "pass",
                  "weight": 2,
                  "detail": "1 form(s) with named, labelled inputs and a submittable action an agent can complete.",
                  "rec": null
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1300 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 13,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, Brand or Person entity in structured data.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 20,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "8 extractable signals (statistics, figures, quotations, definitions) a model can lift and attribute.",
                  "rec": null
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No machine-readable entity (Organisation / Brand / Person)"
            },
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "Stagecoach",
      "domain": "stagecoachbus.com",
      "ok": false,
      "reason": "BLOCKED (HTTP 403)",
      "wafVendor": "Cloudflare"
    },
    {
      "name": "FirstGroup",
      "domain": "firstgroupplc.com",
      "ok": false,
      "reason": "UNREACHABLE (no response)",
      "wafVendor": ""
    },
    {
      "name": "Go-Ahead Group",
      "domain": "go-ahead.com",
      "ok": true,
      "finalUrl": "https://www.go-ahead.com/",
      "offDomain": "go-ahead.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 70,
        "execution": 82,
        "representation": 43,
        "composite": 65
      },
      "detail": {
        "retrieval": {
          "score": 70,
          "band": "Partly legible",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 53,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "pass",
                  "weight": 2,
                  "detail": "Entity type declared: Person, Organization.",
                  "rec": null
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "partial",
                  "weight": 2,
                  "detail": "1 distinct external profile linked via sameAs.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Named author or person with credibility detail (role, employer, expertise or profiles).",
                  "rec": null
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 79,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 valid JSON-LD block(s).",
                  "rec": null
                },
                {
                  "label": "Linked entity graph",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "Entities are linked with @graph / @id, and the page references its subject.",
                  "rec": null
                },
                {
                  "label": "Rich content types",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "Rich types present: Article.",
                  "rec": null
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "pass",
                  "weight": 1,
                  "detail": "datePublished / dateModified present in structured data.",
                  "rec": null
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 67,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "14 of 45 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 H1, 17 H2, 22 H3.",
                  "rec": null
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 80,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 757 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 25 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No meta description found.",
                  "rec": "Add a clear meta description."
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 44 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 78,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "fail",
                  "weight": 1,
                  "detail": "1/3 Open Graph tags plus a Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "Missing meta description"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 82,
          "band": "Agent-operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 71,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "pass",
                  "weight": 2.5,
                  "detail": "A consequential action is described in schema.",
                  "rec": null
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 75,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "partial",
                  "weight": 2,
                  "detail": "No HTML form on this page, so an agent cannot complete a form-based task here.",
                  "rec": "Provide real <form> elements with a real action attribute, named inputs and <label>/aria-label, and no honeypot trap, so an agent can read and complete the task. Forms wired only in JavaScript are invisible to non-rendering agents."
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 757 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 43,
          "band": "Ambiguous identity",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 50,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "partial",
                  "weight": 2,
                  "detail": "Entity declared (The Go-Ahead Group), but thin: no description; no knowsAbout / areaServed / founder detail.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Entity name is consistent across surfaces, but no legal identifier (company number, VAT, LEI) is declared.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "1 sameAs link(s), but none to an authoritative home.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 80,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "Named author or person with credibility detail (role, employer, expertise or profiles).",
                  "rec": null
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "12 extractable signals (statistics, figures, quotations, definitions) a model can lift and attribute.",
                  "rec": null
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No usage terms found on the page (license, copyrightHolder, meta reservation), and the TDM reservation file (/.well-known/tdmrep.json) could not be read on this scan, so the declared-terms verdict is unmeasured rather than a definitive absence. (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": true
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": [
        "tdmrep-unmeasured"
      ]
    },
    {
      "name": "Arriva",
      "domain": "arriva.co.uk",
      "ok": false,
      "reason": "UNREACHABLE (no response)",
      "wafVendor": ""
    },
    {
      "name": "FlixBus",
      "domain": "flixbus.com",
      "ok": true,
      "finalUrl": "https://www.flixbus.com/",
      "offDomain": "flixbus.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 57,
        "execution": 62,
        "representation": 32,
        "composite": 50
      },
      "detail": {
        "retrieval": {
          "score": 57,
          "band": "Partly legible",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 53,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "pass",
                  "weight": 2,
                  "detail": "Entity type declared: Organization.",
                  "rec": null
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "pass",
                  "weight": 2,
                  "detail": "3 distinct external profiles linked via sameAs.",
                  "rec": null
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 32,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 valid JSON-LD block(s).",
                  "rec": null
                },
                {
                  "label": "Linked entity graph",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "The page references a subject, but the schema is otherwise flat.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 50,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "2 of 12 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": "Write several concise, self-contained paragraphs (roughly 40 to 450 characters, at least eight words each) that each answer a real question, rather than long unbroken blocks or repeated one-liners."
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 H1, 15 H2, 4 H3.",
                  "rec": null
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 90,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1100 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 55 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Meta description is 233 characters.",
                  "rec": "Aim for a 70 to 180 character description; it is often quoted verbatim as your summary."
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "96% of 77 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 74,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "A sitemap exists but carries no lastmod dates.",
                  "rec": "Publish a sitemap.xml with lastmod dates and reference it in robots.txt."
                },
                {
                  "label": "Social / Open Graph",
                  "status": "fail",
                  "weight": 1,
                  "detail": "1/3 Open Graph tags, no Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "1 insecure HTTP resource on a secure page"
            },
            {
              "sev": "warning",
              "label": "3 images missing alt text"
            },
            {
              "sev": "warning",
              "label": "Meta description over 180 characters"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 62,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 75,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "partial",
                  "weight": 2,
                  "detail": "No HTML form on this page, so an agent cannot complete a form-based task here.",
                  "rec": "Provide real <form> elements with a real action attribute, named inputs and <label>/aria-label, and no honeypot trap, so an agent can read and complete the task. Forms wired only in JavaScript are invisible to non-rendering agents."
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1100 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 32,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 50,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "partial",
                  "weight": 2,
                  "detail": "Entity declared (FlixBus), but thin: no description; no knowsAbout / areaServed / founder detail.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Entity name is consistent across surfaces, but no legal identifier (company number, VAT, LEI) is declared.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 30,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "1 confirmed and 0 unverified authoritative home(s) (of 3 declared; the rest did not resolve): en.wikipedia.org.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "A registry link is confirmed, but no distinct profile source corroborates it.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 0,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Few extractable, quotable claims; little for a model to cite back to you.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 3,
              "reachable": 3,
              "confirmed": 1,
              "dead": 0,
              "links": [
                {
                  "host": "en.wikipedia.org",
                  "status": 200,
                  "state": "confirmed"
                },
                {
                  "host": "facebook.com",
                  "status": 200,
                  "state": "reachable"
                },
                {
                  "host": "instagram.com",
                  "status": 200,
                  "state": "reachable"
                }
              ],
              "scoringHosts": [
                "en.wikipedia.org"
              ],
              "confirmedHosts": [
                "en.wikipedia.org"
              ],
              "unverifiedHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "Transdev",
      "domain": "transdev.com",
      "ok": true,
      "finalUrl": "https://www.transdev.com/",
      "offDomain": "transdev.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 61,
        "execution": 87,
        "representation": 8,
        "composite": 52
      },
      "detail": {
        "retrieval": {
          "score": 61,
          "band": "Partly legible",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 14,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, LocalBusiness or Person markup found.",
                  "rec": "Declare an Organisation (or LocalBusiness / Person) entity in JSON-LD so AI engines can identify and attribute you by name."
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "pass",
                  "weight": 1,
                  "detail": "BreadcrumbList schema present.",
                  "rec": null
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 57,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 valid JSON-LD block(s).",
                  "rec": null
                },
                {
                  "label": "Linked entity graph",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "Entities are linked with @graph / @id, and the page references its subject.",
                  "rec": null
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "pass",
                  "weight": 1,
                  "detail": "datePublished / dateModified present in structured data.",
                  "rec": null
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 67,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "13 of 21 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 H1, 8 H2, 11 H3.",
                  "rec": null
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 80,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1700 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 25 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No meta description found.",
                  "rec": "Add a clear meta description."
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 22 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 96,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "pass",
                  "weight": 1,
                  "detail": "3/3 Open Graph tags plus a Twitter card.",
                  "rec": null
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "Missing meta description"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 87,
          "band": "Agent-operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 71,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "pass",
                  "weight": 2.5,
                  "detail": "A consequential action is described in schema.",
                  "rec": null
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 95,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "pass",
                  "weight": 2,
                  "detail": "5 form(s) with named, labelled inputs and a submittable action an agent can complete.",
                  "rec": null
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1700 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 8,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, Brand or Person entity in structured data.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 0,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Few extractable, quotable claims; little for a model to cite back to you.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No usage terms found on the page (license, copyrightHolder, meta reservation), and the TDM reservation file (/.well-known/tdmrep.json) could not be read on this scan, so the declared-terms verdict is unmeasured rather than a definitive absence. (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No machine-readable entity (Organisation / Brand / Person)"
            },
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": true
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": [
        "tdmrep-unmeasured"
      ]
    },
    {
      "name": "Keolis",
      "domain": "keolis.com",
      "ok": false,
      "reason": "UNREACHABLE (no response)",
      "wafVendor": ""
    },
    {
      "name": "RATP Group",
      "domain": "ratpgroup.com",
      "ok": true,
      "finalUrl": "https://ratpgroup.com/fr/",
      "offDomain": "ratpgroup.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 46,
        "execution": 62,
        "representation": 8,
        "composite": 39
      },
      "detail": {
        "retrieval": {
          "score": 46,
          "band": "Significant gaps",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 3,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, LocalBusiness or Person markup found.",
                  "rec": "Declare an Organisation (or LocalBusiness / Person) entity in JSON-LD so AI engines can identify and attribute you by name."
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 0,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No JSON-LD found.",
                  "rec": "Add JSON-LD structured data; it is how a machine reads your facts rather than guessing them."
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 67,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "14 of 25 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 H1, 5 H2, 5 H3.",
                  "rec": null
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 90,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 635 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Title is 74 characters.",
                  "rec": "Aim for a 15 to 70 character title that states who you are and what you do."
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 133 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 12 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 87,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "partial",
                  "weight": 1,
                  "detail": "2/3 Open Graph tags plus a Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "Title likely truncated in results (over 65 characters)"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 62,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 75,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "partial",
                  "weight": 2,
                  "detail": "No HTML form on this page, so an agent cannot complete a form-based task here.",
                  "rec": "Provide real <form> elements with a real action attribute, named inputs and <label>/aria-label, and no honeypot trap, so an agent can read and complete the task. Forms wired only in JavaScript are invisible to non-rendering agents."
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 635 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 8,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, Brand or Person entity in structured data.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 0,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Few extractable, quotable claims; little for a model to cite back to you.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No machine-readable entity (Organisation / Brand / Person)"
            },
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "Prologis",
      "domain": "prologis.com",
      "ok": false,
      "reason": "BLOCKED (HTTP 403)",
      "wafVendor": "Cloudflare"
    },
    {
      "name": "SEGRO",
      "domain": "segro.com",
      "ok": false,
      "reason": "UNREACHABLE (no response)",
      "wafVendor": ""
    },
    {
      "name": "Tritax Big Box",
      "domain": "tritaxbigbox.co.uk",
      "ok": true,
      "finalUrl": "https://www.tritaxbigbox.co.uk/",
      "offDomain": "tritaxbigbox.co.uk",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 56,
        "execution": 68,
        "representation": 53,
        "composite": 59
      },
      "detail": {
        "retrieval": {
          "score": 56,
          "band": "Partly legible",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 61,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "pass",
                  "weight": 2,
                  "detail": "Entity type declared: Corporation, Organization.",
                  "rec": null
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "pass",
                  "weight": 2,
                  "detail": "3 distinct external profiles linked via sameAs.",
                  "rec": null
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Your entity carries some descriptive depth.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 43,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 valid JSON-LD block(s).",
                  "rec": null
                },
                {
                  "label": "Linked entity graph",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "Entities are linked with @graph / @id, and the page references its subject.",
                  "rec": null
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 33,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "22 of 42 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "0 H1, 6 H2, 0 H3.",
                  "rec": "Use exactly one H1, then H2/H3 to structure the content a model parses."
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 70,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 844 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Title is 77 characters.",
                  "rec": "Aim for a 15 to 70 character title that states who you are and what you do."
                },
                {
                  "label": "Meta description quality",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No meta description found.",
                  "rec": "Add a clear meta description."
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "81% of 27 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 83,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No canonical link found.",
                  "rec": "Declare a canonical URL so engines consolidate signals on one address."
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "partial",
                  "weight": 1,
                  "detail": "2/3 Open Graph tags plus a Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No H1 heading on the page"
            },
            {
              "sev": "warning",
              "label": "5 images missing alt text"
            },
            {
              "sev": "warning",
              "label": "Title likely truncated in results (over 65 characters)"
            },
            {
              "sev": "warning",
              "label": "Missing meta description"
            },
            {
              "sev": "warning",
              "label": "No canonical URL declared"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 68,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 95,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "pass",
                  "weight": 2,
                  "detail": "2 form(s) with named, labelled inputs and a submittable action an agent can complete.",
                  "rec": null
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 844 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 53,
          "band": "Ambiguous identity",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 50,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "partial",
                  "weight": 2,
                  "detail": "Entity declared (Tritax Big Box REIT plc), but thin: no knowsAbout / areaServed / founder detail.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Entity name is consistent across surfaces, but no legal identifier (company number, VAT, LEI) is declared.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 100,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "2 confirmed and 0 unverified authoritative home(s) (of 3 declared; the rest did not resolve): x.com, en.wikipedia.org.",
                  "rec": null
                },
                {
                  "label": "Spans registry and profile",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Identity spans a confirmed registry (en.wikipedia.org) and a profile source.",
                  "rec": null
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 0,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Few extractable, quotable claims; little for a model to cite back to you.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 3,
              "reachable": 3,
              "confirmed": 2,
              "dead": 0,
              "links": [
                {
                  "host": "linkedin.com",
                  "status": 200,
                  "state": "reachable"
                },
                {
                  "host": "x.com",
                  "status": 200,
                  "state": "confirmed"
                },
                {
                  "host": "en.wikipedia.org",
                  "status": 200,
                  "state": "confirmed"
                }
              ],
              "scoringHosts": [
                "x.com",
                "en.wikipedia.org"
              ],
              "confirmedHosts": [
                "x.com",
                "en.wikipedia.org"
              ],
              "unverifiedHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "Lineage",
      "domain": "onelineage.com",
      "ok": true,
      "finalUrl": "https://www.onelineage.com/",
      "offDomain": "onelineage.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 55,
        "execution": 62,
        "representation": 28,
        "composite": 48
      },
      "detail": {
        "retrieval": {
          "score": 55,
          "band": "Partly legible",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 25,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "pass",
                  "weight": 2,
                  "detail": "Entity type declared: Organization.",
                  "rec": null
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 43,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 valid JSON-LD block(s).",
                  "rec": null
                },
                {
                  "label": "Linked entity graph",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "Entities are linked with @graph / @id, and the page references its subject.",
                  "rec": null
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 50,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "10 of 11 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "2 H1, 5 H2, 1 H3.",
                  "rec": "Use exactly one H1, then H2/H3 to structure the content a model parses."
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 100,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 921 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 68 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 144 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 22 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 78,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "fail",
                  "weight": 1,
                  "detail": "0/3 Open Graph tags, no Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "Multiple H1 headings (2)"
            },
            {
              "sev": "warning",
              "label": "Title likely truncated in results (over 65 characters)"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 62,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 75,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "partial",
                  "weight": 2,
                  "detail": "No HTML form on this page, so an agent cannot complete a form-based task here.",
                  "rec": "Provide real <form> elements with a real action attribute, named inputs and <label>/aria-label, and no honeypot trap, so an agent can read and complete the task. Forms wired only in JavaScript are invisible to non-rendering agents."
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 921 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 28,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 50,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "partial",
                  "weight": 2,
                  "detail": "Entity declared (Lineage), but thin: no description; no knowsAbout / areaServed / founder detail.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Entity name is consistent across surfaces, but no legal identifier (company number, VAT, LEI) is declared.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 20,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "7 extractable signals (statistics, figures, quotations, definitions) a model can lift and attribute.",
                  "rec": null
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "Cargolux",
      "domain": "cargolux.com",
      "ok": true,
      "finalUrl": "https://www.cargolux.com/",
      "offDomain": "cargolux.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 41,
        "execution": 68,
        "representation": 8,
        "composite": 39
      },
      "detail": {
        "retrieval": {
          "score": 41,
          "band": "Significant gaps",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 3,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, LocalBusiness or Person markup found.",
                  "rec": "Declare an Organisation (or LocalBusiness / Person) entity in JSON-LD so AI engines can identify and attribute you by name."
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 0,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No JSON-LD found.",
                  "rec": "Add JSON-LD structured data; it is how a machine reads your facts rather than guessing them."
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 50,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "31 of 35 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "2 H1, 3 H2, 4 H3.",
                  "rec": "Use exactly one H1, then H2/H3 to structure the content a model parses."
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 90,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1500 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 36 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Meta description is 46 characters.",
                  "rec": "Aim for a 70 to 180 character description; it is often quoted verbatim as your summary."
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "98% of 45 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 83,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No canonical link found.",
                  "rec": "Declare a canonical URL so engines consolidate signals on one address."
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "partial",
                  "weight": 1,
                  "detail": "3/3 Open Graph tags, no Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "Multiple H1 headings (2)"
            },
            {
              "sev": "warning",
              "label": "1 image missing alt text"
            },
            {
              "sev": "warning",
              "label": "No canonical URL declared"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 68,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 95,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "pass",
                  "weight": 2,
                  "detail": "3 form(s) with named, labelled inputs and a submittable action an agent can complete.",
                  "rec": null
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1500 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 8,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, Brand or Person entity in structured data.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 0,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Few extractable, quotable claims; little for a model to cite back to you.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No machine-readable entity (Organisation / Brand / Person)"
            },
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "Atlas Air",
      "domain": "atlasair.com",
      "ok": true,
      "finalUrl": "https://www.atlasair.com/",
      "offDomain": "atlasair.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 51,
        "execution": 87,
        "representation": 10,
        "composite": 49
      },
      "detail": {
        "retrieval": {
          "score": 51,
          "band": "Significant gaps",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 14,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, LocalBusiness or Person markup found.",
                  "rec": "Declare an Organisation (or LocalBusiness / Person) entity in JSON-LD so AI engines can identify and attribute you by name."
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "pass",
                  "weight": 1,
                  "detail": "BreadcrumbList schema present.",
                  "rec": null
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 57,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 valid JSON-LD block(s).",
                  "rec": null
                },
                {
                  "label": "Linked entity graph",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "Entities are linked with @graph / @id, and the page references its subject.",
                  "rec": null
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "pass",
                  "weight": 1,
                  "detail": "datePublished / dateModified present in structured data.",
                  "rec": null
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 33,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "8 of 18 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "0 H1, 4 H2, 0 H3.",
                  "rec": "Use exactly one H1, then H2/H3 to structure the content a model parses."
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 90,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 890 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 65 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 152 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "partial",
                  "weight": 1,
                  "detail": "79% of 14 images have alt text.",
                  "rec": "Give images descriptive alt text; it is readable context a model can use."
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 87,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "partial",
                  "weight": 1,
                  "detail": "2/3 Open Graph tags plus a Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No H1 heading on the page"
            },
            {
              "sev": "error",
              "label": "1 insecure HTTP resource on a secure page"
            },
            {
              "sev": "warning",
              "label": "3 images missing alt text"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 87,
          "band": "Agent-operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 429). 1 probe(s) returned a transient rate-limit or timeout and are not counted as a block.",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 71,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "pass",
                  "weight": 2.5,
                  "detail": "A consequential action is described in schema.",
                  "rec": null
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 95,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "pass",
                  "weight": 2,
                  "detail": "4 form(s) with named, labelled inputs and a submittable action an agent can complete.",
                  "rec": null
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 890 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 10,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, Brand or Person entity in structured data.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 10,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "2 extractable signals (statistics, figures, quotations, definitions) a model can lift and attribute.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No machine-readable entity (Organisation / Brand / Person)"
            },
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "Swissport",
      "domain": "swissport.com",
      "ok": true,
      "finalUrl": "https://www.swissport.com/",
      "offDomain": "swissport.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 50,
        "execution": 30,
        "representation": 10,
        "composite": 30
      },
      "detail": {
        "retrieval": {
          "score": 50,
          "band": "Significant gaps",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 3,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, LocalBusiness or Person markup found.",
                  "rec": "Declare an Organisation (or LocalBusiness / Person) entity in JSON-LD so AI engines can identify and attribute you by name."
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 0,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No JSON-LD found.",
                  "rec": "Add JSON-LD structured data; it is how a machine reads your facts rather than guessing them."
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 83,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "22 of 53 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "1 question-led heading(s) or Q&A found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 H1, 19 H2, 17 H3.",
                  "rec": null
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 90,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1200 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Title is 75 characters.",
                  "rec": "Aim for a 15 to 70 character title that states who you are and what you do."
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 75 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "97% of 29 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 87,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "partial",
                  "weight": 1,
                  "detail": "2/3 Open Graph tags, no Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "1 image missing alt text"
            },
            {
              "sev": "warning",
              "label": "Title likely truncated in results (over 65 characters)"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 30,
          "band": "Closed to agents",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 25,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "fail",
                  "weight": 3,
                  "detail": "Every probed AI agent is refused at the edge while a browser gets 200 (OAI-SearchBot 403, PerplexityBot 403, ClaudeBot 403, GPTBot 403).",
                  "rec": "Your CDN or WAF is refusing AI user-agents at the network layer, so the page is invisible to those agents regardless of robots.txt. If you intend to be agent-reachable, allow the retrieval user-agents (OAI-SearchBot, PerplexityBot, Claude-SearchBot) in your bot-management or Pay-Per-Crawl settings. Note: we test this by sending these user-agent strings from our scanner, so it measures how your edge treats the user-agent; a real agent presents the same string from its own network, making this a strong signal rather than a guarantee."
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 95,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "pass",
                  "weight": 2,
                  "detail": "2 form(s) with named, labelled inputs and a submittable action an agent can complete.",
                  "rec": null
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1200 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "AI agents are refused at the edge (CDN/WAF), not just in robots.txt"
            },
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 10,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, Brand or Person entity in structured data.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 10,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "2 extractable signals (statistics, figures, quotations, definitions) a model can lift and attribute.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No machine-readable entity (Organisation / Brand / Person)"
            },
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "dnata",
      "domain": "dnata.com",
      "ok": true,
      "finalUrl": "https://www.dnata.com/en/",
      "offDomain": "dnata.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 34,
        "execution": 58,
        "representation": 8,
        "composite": 33
      },
      "detail": {
        "retrieval": {
          "score": 34,
          "band": "Largely invisible to AI",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 3,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, LocalBusiness or Person markup found.",
                  "rec": "Declare an Organisation (or LocalBusiness / Person) entity in JSON-LD so AI engines can identify and attribute you by name."
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 0,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No JSON-LD found.",
                  "rec": "Add JSON-LD structured data; it is how a machine reads your facts rather than guessing them."
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 33,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "3 of 7 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": "Write several concise, self-contained paragraphs (roughly 40 to 450 characters, at least eight words each) that each answer a real question, rather than long unbroken blocks or repeated one-liners."
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "9 H1, 8 H2, 0 H3.",
                  "rec": "Use exactly one H1, then H2/H3 to structure the content a model parses."
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 65,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "About 323 words of readable text.",
                  "rec": "Give models enough clean, standalone prose to quote. This measures depth, not quality; a focused page can be cited at lower length, but very thin pages rarely are."
                },
                {
                  "label": "Title quality",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No title tag found.",
                  "rec": "Add a descriptive title tag."
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 156 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "94% of 18 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 83,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "robots.txt could not be read on this pass (a transient network fault or rate-limit), so AI crawler access is inconclusive and is not scored as a pass.",
                  "rec": "Re-run the scan. If robots.txt still will not load, confirm it responds with 200 and does not Disallow the AI answer crawlers (OAI-SearchBot, PerplexityBot, Claude-SearchBot)."
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "pass",
                  "weight": 1,
                  "detail": "3/3 Open Graph tags plus a Twitter card.",
                  "rec": null
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "Multiple H1 headings (9)"
            },
            {
              "sev": "error",
              "label": "Missing title tag"
            },
            {
              "sev": "warning",
              "label": "1 image missing alt text"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": true
        },
        "execution": {
          "score": 58,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 88,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "partial",
                  "weight": 1,
                  "detail": "robots.txt could not be read on this scan (a transient network fault or rate-limit), so the declared retrieval policy is unmeasured; held inconclusive, not scored as a pass or a block.",
                  "rec": "Re-run the scan. If robots.txt still will not load, confirm it responds with 200 and does not Disallow the retrieval agents (OAI-SearchBot, PerplexityBot, Claude-SearchBot)."
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 75,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "partial",
                  "weight": 2,
                  "detail": "No HTML form on this page, so an agent cannot complete a form-based task here.",
                  "rec": "Provide real <form> elements with a real action attribute, named inputs and <label>/aria-label, and no honeypot trap, so an agent can read and complete the task. Forms wired only in JavaScript are invisible to non-rendering agents."
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 323 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": true
        },
        "representation": {
          "score": 8,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, Brand or Person entity in structured data.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 0,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Few extractable, quotable claims; little for a model to cite back to you.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No usage terms found on the page (license, copyrightHolder, meta reservation), and the TDM reservation file (/.well-known/tdmrep.json) could not be read on this scan, so the declared-terms verdict is unmeasured rather than a definitive absence. (training-crawler posture unmeasured this scan: robots.txt could not be read.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No machine-readable entity (Organisation / Brand / Person)"
            },
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": true
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": [
        "robots-unmeasured",
        "tdmrep-unmeasured"
      ]
    },
    {
      "name": "Menzies Aviation",
      "domain": "menziesaviation.com",
      "ok": true,
      "finalUrl": "https://menziesaviation.com/",
      "offDomain": "menziesaviation.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 56,
        "execution": 85,
        "representation": 10,
        "composite": 50
      },
      "detail": {
        "retrieval": {
          "score": 56,
          "band": "Partly legible",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 14,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, LocalBusiness or Person markup found.",
                  "rec": "Declare an Organisation (or LocalBusiness / Person) entity in JSON-LD so AI engines can identify and attribute you by name."
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "pass",
                  "weight": 1,
                  "detail": "BreadcrumbList schema present.",
                  "rec": null
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 57,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 valid JSON-LD block(s).",
                  "rec": null
                },
                {
                  "label": "Linked entity graph",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "Entities are linked with @graph / @id, and the page references its subject.",
                  "rec": null
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "pass",
                  "weight": 1,
                  "detail": "datePublished / dateModified present in structured data.",
                  "rec": null
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 67,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "8 of 17 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 H1, 7 H2, 7 H3.",
                  "rec": null
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 70,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 586 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Title is 14 characters.",
                  "rec": "Aim for a 15 to 70 character title that states who you are and what you do."
                },
                {
                  "label": "Meta description quality",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No meta description found.",
                  "rec": "Add a clear meta description."
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 60 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 78,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "No robots.txt is blocking AI crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "fail",
                  "weight": 1,
                  "detail": "1/3 Open Graph tags plus a Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "Missing meta description"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 85,
          "band": "Agent-operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No robots.txt is blocking retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 71,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "pass",
                  "weight": 2.5,
                  "detail": "A consequential action is described in schema.",
                  "rec": null
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 85,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "pass",
                  "weight": 2,
                  "detail": "1 form(s) with named, labelled inputs and a submittable action an agent can complete.",
                  "rec": null
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 586 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "partial",
                  "weight": 1,
                  "detail": "An invisible reCAPTCHA v3 is present; it scores requests rather than blocking outright, but can still gate an action on a low score.",
                  "rec": "Do not gate primary actions behind an interactive CAPTCHA (hCaptcha, Turnstile, reCAPTCHA v2), which agents cannot solve. Invisible scoring (reCAPTCHA v3) is less hostile but can still block a low-scoring agent, so keep it off critical task paths."
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 10,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, Brand or Person entity in structured data.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 10,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "3 extractable signals (statistics, figures, quotations, definitions) a model can lift and attribute.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No usage terms found on the page (license, copyrightHolder, meta reservation), and the TDM reservation file (/.well-known/tdmrep.json) could not be read on this scan, so the declared-terms verdict is unmeasured rather than a definitive absence. (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No machine-readable entity (Organisation / Brand / Person)"
            },
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": true
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": [
        "tdmrep-unmeasured"
      ]
    },
    {
      "name": "SATS",
      "domain": "sats.com.sg",
      "ok": false,
      "reason": "UNREADABLE (no content / client-side rendered)",
      "wafVendor": ""
    },
    {
      "name": "Heathrow Airport",
      "domain": "heathrow.com",
      "ok": true,
      "finalUrl": "https://www.heathrow.com/",
      "offDomain": "heathrow.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 58,
        "execution": 69,
        "representation": 32,
        "composite": 53
      },
      "detail": {
        "retrieval": {
          "score": 58,
          "band": "Partly legible",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 58,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "pass",
                  "weight": 2,
                  "detail": "Entity type declared: Organization.",
                  "rec": null
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "pass",
                  "weight": 2,
                  "detail": "5 distinct external profiles linked via sameAs.",
                  "rec": null
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Logo and contact details in structured data.",
                  "rec": null
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 21,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 valid JSON-LD block(s).",
                  "rec": null
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 50,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "14 of 33 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "6 H1, 5 H2, 1 H3.",
                  "rec": "Use exactly one H1, then H2/H3 to structure the content a model parses."
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 100,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 939 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 48 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 132 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "94% of 32 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 78,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "fail",
                  "weight": 1,
                  "detail": "1/3 Open Graph tags plus a Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "Multiple H1 headings (6)"
            },
            {
              "sev": "warning",
              "label": "2 images missing alt text"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 69,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 100,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "pass",
                  "weight": 2,
                  "detail": "1 form(s) with named, labelled inputs and a submittable action an agent can complete.",
                  "rec": null
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 939 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A contact route (ContactPoint, mailto or tel) is available for an agent to hand off.",
                  "rec": null
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 32,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 50,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "partial",
                  "weight": 2,
                  "detail": "Entity declared (Heathrow Airport), but thin: no description; no knowsAbout / areaServed / founder detail.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Entity name is consistent across surfaces, but no legal identifier (company number, VAT, LEI) is declared.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 30,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "1 confirmed and 0 unverified authoritative home(s) (of 5 declared; the rest did not resolve): twitter.com.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "Profile links are present, but no CONFIRMED authoritative registry (Wikidata, Companies House, OpenCorporates) anchors them.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 0,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Few extractable, quotable claims; little for a model to cite back to you.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 5,
              "reachable": 5,
              "confirmed": 1,
              "dead": 0,
              "links": [
                {
                  "host": "twitter.com",
                  "status": 200,
                  "state": "confirmed"
                },
                {
                  "host": "facebook.com",
                  "status": 200,
                  "state": "reachable"
                },
                {
                  "host": "youtube.com",
                  "status": 200,
                  "state": "reachable"
                },
                {
                  "host": "instagram.com",
                  "status": 200,
                  "state": "reachable"
                },
                {
                  "host": "tiktok.com",
                  "status": 200,
                  "state": "reachable"
                }
              ],
              "scoringHosts": [
                "twitter.com"
              ],
              "confirmedHosts": [
                "twitter.com"
              ],
              "unverifiedHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "Gatwick Airport",
      "domain": "gatwickairport.com",
      "ok": true,
      "finalUrl": "https://www.gatwickairport.com/",
      "offDomain": "gatwickairport.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 56,
        "execution": 62,
        "representation": 37,
        "composite": 52
      },
      "detail": {
        "retrieval": {
          "score": 56,
          "band": "Partly legible",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 64,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "pass",
                  "weight": 2,
                  "detail": "Entity type declared: Organization.",
                  "rec": null
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "pass",
                  "weight": 2,
                  "detail": "4 distinct external profiles linked via sameAs.",
                  "rec": null
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "pass",
                  "weight": 1,
                  "detail": "BreadcrumbList schema present.",
                  "rec": null
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 32,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 valid JSON-LD block(s).",
                  "rec": null
                },
                {
                  "label": "Linked entity graph",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Uses @graph / @id, but the page does not reference a subject entity.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 33,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "26 of 51 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "0 H1, 0 H2, 0 H3.",
                  "rec": "Use exactly one H1, then H2/H3 to structure the content a model parses."
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 100,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1600 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 56 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 147 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "91% of 101 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 74,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "A sitemap exists but carries no lastmod dates.",
                  "rec": "Publish a sitemap.xml with lastmod dates and reference it in robots.txt."
                },
                {
                  "label": "Social / Open Graph",
                  "status": "fail",
                  "weight": 1,
                  "detail": "0/3 Open Graph tags, no Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No H1 heading on the page"
            },
            {
              "sev": "warning",
              "label": "9 images missing alt text"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 62,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 75,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "partial",
                  "weight": 2,
                  "detail": "No HTML form on this page, so an agent cannot complete a form-based task here.",
                  "rec": "Provide real <form> elements with a real action attribute, named inputs and <label>/aria-label, and no honeypot trap, so an agent can read and complete the task. Forms wired only in JavaScript are invisible to non-rendering agents."
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 1600 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 37,
          "band": "Ambiguous identity",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 50,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "partial",
                  "weight": 2,
                  "detail": "Entity declared (London Gatwick Airport), but thin: no description; no knowsAbout / areaServed / founder detail.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Entity name is consistent across surfaces, but no legal identifier (company number, VAT, LEI) is declared.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 30,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "1 confirmed and 0 unverified authoritative home(s) (of 4 declared; the rest did not resolve): twitter.com.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "Profile links are present, but no CONFIRMED authoritative registry (Wikidata, Companies House, OpenCorporates) anchors them.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 20,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "10 extractable signals (statistics, figures, quotations, definitions) a model can lift and attribute.",
                  "rec": null
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 4,
              "reachable": 4,
              "confirmed": 1,
              "dead": 0,
              "links": [
                {
                  "host": "facebook.com",
                  "status": 200,
                  "state": "reachable"
                },
                {
                  "host": "twitter.com",
                  "status": 200,
                  "state": "confirmed"
                },
                {
                  "host": "instagram.com",
                  "status": 200,
                  "state": "reachable"
                },
                {
                  "host": "youtube.com",
                  "status": 200,
                  "state": "reachable"
                }
              ],
              "scoringHosts": [
                "twitter.com"
              ],
              "confirmedHosts": [
                "twitter.com"
              ],
              "unverifiedHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "Manchester Airports Group",
      "domain": "magairports.com",
      "ok": true,
      "finalUrl": "https://magairports.com/",
      "offDomain": "magairports.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 29,
        "execution": 58,
        "representation": 10,
        "composite": 32
      },
      "detail": {
        "retrieval": {
          "score": 29,
          "band": "Largely invisible to AI",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 3,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, LocalBusiness or Person markup found.",
                  "rec": "Declare an Organisation (or LocalBusiness / Person) entity in JSON-LD so AI engines can identify and attribute you by name."
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 0,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No JSON-LD found.",
                  "rec": "Add JSON-LD structured data; it is how a machine reads your facts rather than guessing them."
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 17,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "2 of 12 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": "Write several concise, self-contained paragraphs (roughly 40 to 450 characters, at least eight words each) that each answer a real question, rather than long unbroken blocks or repeated one-liners."
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "2 H1, 0 H2, 0 H3.",
                  "rec": "Use exactly one H1, then H2/H3 to structure the content a model parses."
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 70,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "About 215 words of readable text.",
                  "rec": "Give models enough clean, standalone prose to quote. This measures depth, not quality; a focused page can be cited at lower length, but very thin pages rarely are."
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 36 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 126 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 17 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 78,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "fail",
                  "weight": 1,
                  "detail": "0/3 Open Graph tags plus a Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "Multiple H1 headings (2)"
            },
            {
              "sev": "warning",
              "label": "Thin content (under 250 words)"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 58,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 60,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "partial",
                  "weight": 2,
                  "detail": "No HTML form on this page, so an agent cannot complete a form-based task here.",
                  "rec": "Provide real <form> elements with a real action attribute, named inputs and <label>/aria-label, and no honeypot trap, so an agent can read and complete the task. Forms wired only in JavaScript are invisible to non-rendering agents."
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "Only about 215 words in the static HTML; some content likely depends on JavaScript.",
                  "rec": "Server-render or pre-render the primary content and controls. Agents and most crawlers do not execute JavaScript, so a client-rendered action surface is invisible to them."
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 10,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, Brand or Person entity in structured data.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 10,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "2 extractable signals (statistics, figures, quotations, definitions) a model can lift and attribute.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No machine-readable entity (Organisation / Brand / Person)"
            },
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "Aena",
      "domain": "aena.es",
      "ok": false,
      "reason": "UNREACHABLE (no response)",
      "wafVendor": ""
    },
    {
      "name": "Fraport",
      "domain": "fraport.com",
      "ok": true,
      "finalUrl": "https://www.fraport.com/de.html",
      "offDomain": "fraport.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 40,
        "execution": 69,
        "representation": 8,
        "composite": 39
      },
      "detail": {
        "retrieval": {
          "score": 40,
          "band": "Significant gaps",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 3,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, LocalBusiness or Person markup found.",
                  "rec": "Declare an Organisation (or LocalBusiness / Person) entity in JSON-LD so AI engines can identify and attribute you by name."
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 0,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No JSON-LD found.",
                  "rec": "Add JSON-LD structured data; it is how a machine reads your facts rather than guessing them."
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 50,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "47 of 88 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "4 H1, 2 H2, 2 H3.",
                  "rec": "Use exactly one H1, then H2/H3 to structure the content a model parses."
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 80,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 4200 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Title is 10 characters.",
                  "rec": "Aim for a 15 to 70 character title that states who you are and what you do."
                },
                {
                  "label": "Meta description quality",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Meta description is 375 characters.",
                  "rec": "Aim for a 70 to 180 character description; it is often quoted verbatim as your summary."
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 222 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 83,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "A sitemap exists but carries no lastmod dates.",
                  "rec": "Publish a sitemap.xml with lastmod dates and reference it in robots.txt."
                },
                {
                  "label": "Social / Open Graph",
                  "status": "partial",
                  "weight": 1,
                  "detail": "3/3 Open Graph tags, no Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "Multiple H1 headings (4)"
            },
            {
              "sev": "warning",
              "label": "Meta description over 180 characters"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 69,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 100,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "pass",
                  "weight": 2,
                  "detail": "1 form(s) with named, labelled inputs and a submittable action an agent can complete.",
                  "rec": null
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 4200 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A contact route (ContactPoint, mailto or tel) is available for an agent to hand off.",
                  "rec": null
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 8,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, Brand or Person entity in structured data.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 0,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Few extractable, quotable claims; little for a model to cite back to you.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No machine-readable entity (Organisation / Brand / Person)"
            },
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "Groupe ADP",
      "domain": "parisaeroport.fr",
      "ok": true,
      "finalUrl": "https://www.parisaeroport.fr/",
      "offDomain": "parisaeroport.fr",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 14,
        "execution": 34,
        "representation": 8,
        "composite": 19
      },
      "detail": {
        "retrieval": {
          "score": 14,
          "band": "Largely invisible to AI",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 3,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, LocalBusiness or Person markup found.",
                  "rec": "Declare an Organisation (or LocalBusiness / Person) entity in JSON-LD so AI engines can identify and attribute you by name."
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 0,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No JSON-LD found.",
                  "rec": "Add JSON-LD structured data; it is how a machine reads your facts rather than guessing them."
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 0,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No paragraph content found.",
                  "rec": "Write several concise, self-contained paragraphs (roughly 40 to 450 characters, at least eight words each) that each answer a real question, rather than long unbroken blocks or repeated one-liners."
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "0 H1, 0 H2, 0 H3.",
                  "rec": "Use exactly one H1, then H2/H3 to structure the content a model parses."
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 25,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "About 6 words of readable text.",
                  "rec": "Give models enough clean, standalone prose to quote. This measures depth, not quality; a focused page can be cited at lower length, but very thin pages rarely are."
                },
                {
                  "label": "Title quality",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No title tag found.",
                  "rec": "Add a descriptive title tag."
                },
                {
                  "label": "Meta description quality",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No meta description found.",
                  "rec": "Add a clear meta description."
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No images to assess.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No lists, landmarks or header tables found.",
                  "rec": "Use lists, <main>/<article> landmarks and tables with <th> headers; they help AI parsers isolate and extract your content cleanly."
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 50,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "fail",
                  "weight": 1,
                  "detail": "Page is set to noindex (meta or X-Robots-Tag); excluded from search and AI.",
                  "rec": "Remove the noindex directive; a noindexed page cannot be cited."
                },
                {
                  "label": "Canonical URL",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No canonical link found.",
                  "rec": "Declare a canonical URL so engines consolidate signals on one address."
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "fail",
                  "weight": 1,
                  "detail": "0/3 Open Graph tags, no Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "partial",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, no lang.",
                  "rec": "Serve over HTTPS, add a responsive viewport meta tag, and set an html lang attribute."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No H1 heading on the page"
            },
            {
              "sev": "error",
              "label": "Page is set to noindex (excluded from search and AI)"
            },
            {
              "sev": "error",
              "label": "Missing title tag"
            },
            {
              "sev": "warning",
              "label": "Missing meta description"
            },
            {
              "sev": "warning",
              "label": "No canonical URL declared"
            },
            {
              "sev": "warning",
              "label": "Thin content (under 250 words)"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 34,
          "band": "Closed to agents",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 45,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "partial",
                  "weight": 2,
                  "detail": "No HTML form on this page, so an agent cannot complete a form-based task here.",
                  "rec": "Provide real <form> elements with a real action attribute, named inputs and <label>/aria-label, and no honeypot trap, so an agent can read and complete the task. Forms wired only in JavaScript are invisible to non-rendering agents."
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Very little static content (~6 words); agents that do not run JavaScript will see almost nothing.",
                  "rec": "Server-render or pre-render the primary content and controls. Agents and most crawlers do not execute JavaScript, so a client-rendered action surface is invisible to them."
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            },
            {
              "sev": "error",
              "label": "Action surface appears client-side rendered; agents may see little"
            },
            {
              "sev": "warning",
              "label": "Reachable but nothing to operate (little content, no action, no form)"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 8,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, Brand or Person entity in structured data.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 0,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Few extractable, quotable claims; little for a model to cite back to you.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No usage terms found on the page (license, copyrightHolder, meta reservation), and the TDM reservation file (/.well-known/tdmrep.json) could not be read on this scan, so the declared-terms verdict is unmeasured rather than a definitive absence. (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No machine-readable entity (Organisation / Brand / Person)"
            },
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": true
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": [
        "tdmrep-unmeasured"
      ]
    },
    {
      "name": "Schiphol",
      "domain": "schiphol.nl",
      "ok": false,
      "reason": "BLOCKED (HTTP 403)",
      "wafVendor": "Cloudflare"
    },
    {
      "name": "Zurich Airport",
      "domain": "flughafen-zuerich.ch",
      "ok": true,
      "finalUrl": "https://www.flughafen-zuerich.ch/en/passengers",
      "offDomain": "flughafen-zuerich.ch",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 38,
        "execution": 56,
        "representation": 8,
        "composite": 34
      },
      "detail": {
        "retrieval": {
          "score": 38,
          "band": "Significant gaps",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 3,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, LocalBusiness or Person markup found.",
                  "rec": "Declare an Organisation (or LocalBusiness / Person) entity in JSON-LD so AI engines can identify and attribute you by name."
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 0,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No JSON-LD found.",
                  "rec": "Add JSON-LD structured data; it is how a machine reads your facts rather than guessing them."
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 50,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "5 of 15 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "3 H1, 18 H2, 4 H3.",
                  "rec": "Use exactly one H1, then H2/H3 to structure the content a model parses."
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "partial",
                  "weight": 1.5,
                  "detail": "About 320 words of readable text.",
                  "rec": "Give models enough clean, standalone prose to quote. This measures depth, not quality; a focused page can be cited at lower length, but very thin pages rarely are."
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 45 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "partial",
                  "weight": 1,
                  "detail": "Meta description is 400 characters.",
                  "rec": "Aim for a 70 to 180 character description; it is often quoted verbatim as your summary."
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 22 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 78,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "No sitemap found via robots.txt or /sitemap.xml.",
                  "rec": "Publish a sitemap.xml with lastmod dates and reference it in robots.txt."
                },
                {
                  "label": "Social / Open Graph",
                  "status": "partial",
                  "weight": 1,
                  "detail": "3/3 Open Graph tags, no Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "Multiple H1 headings (3)"
            },
            {
              "sev": "warning",
              "label": "Meta description over 180 characters"
            },
            {
              "sev": "warning",
              "label": "No sitemap discoverable"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 56,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 75,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "partial",
                  "weight": 2,
                  "detail": "No HTML form on this page, so an agent cannot complete a form-based task here.",
                  "rec": "Provide real <form> elements with a real action attribute, named inputs and <label>/aria-label, and no honeypot trap, so an agent can read and complete the task. Forms wired only in JavaScript are invisible to non-rendering agents."
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 320 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 25,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "No sitemap found via robots.txt or /sitemap.xml.",
                  "rec": "Publish a sitemap.xml and reference it in robots.txt so agents can enumerate your actionable pages."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 8,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, Brand or Person entity in structured data.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 0,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Few extractable, quotable claims; little for a model to cite back to you.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No machine-readable entity (Organisation / Brand / Person)"
            },
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "Edinburgh Airport",
      "domain": "edinburghairport.com",
      "ok": true,
      "finalUrl": "https://www.edinburghairport.com/",
      "offDomain": "edinburghairport.com",
      "truncated": false,
      "pagesScanned": 1,
      "scores": {
        "retrieval": 46,
        "execution": 62,
        "representation": 8,
        "composite": 39
      },
      "detail": {
        "retrieval": {
          "score": 46,
          "band": "Significant gaps",
          "categories": [
            {
              "key": "entity",
              "label": "Entity & Trust",
              "weight": 0.22,
              "score": 3,
              "checks": [
                {
                  "label": "Organisation / entity schema",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, LocalBusiness or Person markup found.",
                  "rec": "Declare an Organisation (or LocalBusiness / Person) entity in JSON-LD so AI engines can identify and attribute you by name."
                },
                {
                  "label": "Entity disambiguation (sameAs)",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No sameAs links found to verify your identity.",
                  "rec": "Add several sameAs links to distinct profiles (LinkedIn, Companies House, Wikidata, key socials) so a model can confirm you are a real, single entity. Distinct domains count, so several links to one profile count once."
                },
                {
                  "label": "Logo & contact in schema",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No logo and no contact details in structured data.",
                  "rec": "Add a logo and contactPoint / address to your Organisation schema so AI answers can render and trust you."
                },
                {
                  "label": "Authorship & credibility",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Person or author markup found.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout or sameAs. Models weigh named, credentialed authorship (E-E-A-T) when deciding who to trust."
                },
                {
                  "label": "Breadcrumbs",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No BreadcrumbList schema found.",
                  "rec": "Add BreadcrumbList schema so engines understand where this page sits in your site."
                },
                {
                  "label": "Entity detail (description & expertise)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Your entity has a name but little descriptive detail.",
                  "rec": "Flesh out the entity: a description plus knowsAbout, areaServed or founder, so a model understands what you do and for whom."
                },
                {
                  "label": "Social proof schema",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No verifiable reputation signal in your structured data.",
                  "rec": "Link a third-party review profile, such as your Google Business Profile, via sameAs so a model can corroborate your reputation. Reserve Review or AggregateRating schema for eligible pages like individual products with independent reviews; Google disallows self-serving reviews on your own organisation."
                }
              ]
            },
            {
              "key": "schema",
              "label": "Structured Data Depth",
              "weight": 0.2,
              "score": 0,
              "checks": [
                {
                  "label": "Valid structured data (JSON-LD)",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No JSON-LD found.",
                  "rec": "Add JSON-LD structured data; it is how a machine reads your facts rather than guessing them."
                },
                {
                  "label": "Linked entity graph",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Structured data is flat, with no entity linking.",
                  "rec": "Link entities with @id (an @graph) and connect the page to its subject with about / mainEntity, so a model reads one connected entity."
                },
                {
                  "label": "Rich content types",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "Only basic site markup; no Product, Service, Article, FAQ or similar.",
                  "rec": "Mark up what you actually offer (Product, Service, Article, FAQPage, Review). Org-and-website-only schema tells a model almost nothing about your value."
                },
                {
                  "label": "Freshness signals (dates)",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No published or modified dates found.",
                  "rec": "Expose datePublished / dateModified in JSON-LD (an article:published_time meta or <time datetime> is a partial signal). Models favour content they can date."
                },
                {
                  "label": "Offerings marked up",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No Product, Service or Offer markup for what you sell.",
                  "rec": "Mark up what you actually offer (Product, Service or Offer). A model cannot recommend offerings it cannot see."
                }
              ]
            },
            {
              "key": "answer",
              "label": "Answerability",
              "weight": 0.26,
              "score": 67,
              "checks": [
                {
                  "label": "Concise, extractable answers",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "8 of 12 paragraphs are concise, substantive answers a model can lift directly.",
                  "rec": null
                },
                {
                  "label": "Question-led content",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No question-led content found.",
                  "rec": "Frame some sections as the questions buyers actually ask, each with a concise answer beneath. This is the content pattern, not the deprecated FAQ rich result, so no FAQ schema is required."
                },
                {
                  "label": "Heading structure",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "1 H1, 4 H2, 9 H3.",
                  "rec": null
                }
              ]
            },
            {
              "key": "read",
              "label": "Machine Readability",
              "weight": 0.12,
              "score": 100,
              "checks": [
                {
                  "label": "Substantive content",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 694 words of readable text.",
                  "rec": null
                },
                {
                  "label": "Title quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Title is 70 characters.",
                  "rec": null
                },
                {
                  "label": "Meta description quality",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Meta description is 141 characters.",
                  "rec": null
                },
                {
                  "label": "Image alt coverage",
                  "status": "pass",
                  "weight": 1,
                  "detail": "100% of 30 images have alt text.",
                  "rec": null
                },
                {
                  "label": "Semantic structure",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Uses lists, HTML5 landmarks or header-table structure.",
                  "rec": null
                }
              ]
            },
            {
              "key": "access",
              "label": "AI Access & Discovery",
              "weight": 0.2,
              "score": 78,
              "checks": [
                {
                  "label": "llms.txt (forward-looking)",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No llms.txt at the site root.",
                  "rec": "Scored lightly, by design. As of 2026 the major AI search crawlers rarely fetch llms.txt, and Google has stated it has no effect on Google Search. Coding and agent tools (Cursor, Copilot, Claude Code) do read it, and other AI systems may adopt the convention, so it is a sensible, low-cost hedge for the agent era, not an AI-search ranking signal today."
                },
                {
                  "label": "AI crawler access",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "robots.txt allows the major AI answer crawlers.",
                  "rec": null
                },
                {
                  "label": "Indexable & snippet-eligible",
                  "status": "pass",
                  "weight": 1,
                  "detail": "Indexable and snippet-eligible.",
                  "rec": null
                },
                {
                  "label": "Canonical URL",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "Canonical link declared.",
                  "rec": null
                },
                {
                  "label": "Sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap with lastmod dates is discoverable.",
                  "rec": null
                },
                {
                  "label": "Social / Open Graph",
                  "status": "fail",
                  "weight": 1,
                  "detail": "0/3 Open Graph tags, no Twitter card.",
                  "rec": "Complete og:title, og:description, og:image and a twitter:card for clean rendering when shared or cited."
                },
                {
                  "label": "Mobile, language & HTTPS",
                  "status": "pass",
                  "weight": 0.75,
                  "detail": "HTTPS, responsive viewport, lang set.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "Title likely truncated in results (over 65 characters)"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "execution": {
          "score": 62,
          "band": "Partly operable",
          "categories": [
            {
              "key": "access",
              "label": "Agent Access",
              "weight": 0.32,
              "score": 100,
              "checks": [
                {
                  "label": "AI user-agent treatment at the edge",
                  "status": "pass",
                  "weight": 3,
                  "detail": "AI agents reach the page like a browser (browser 200; OAI-SearchBot 200, PerplexityBot 200, ClaudeBot 200, GPTBot 200).",
                  "rec": null
                },
                {
                  "label": "Robots policy for retrieval agents",
                  "status": "pass",
                  "weight": 1,
                  "detail": "robots.txt allows the retrieval agents.",
                  "rec": null
                }
              ]
            },
            {
              "key": "action",
              "label": "Actionability",
              "weight": 0.28,
              "score": 0,
              "checks": [
                {
                  "label": "Machine-readable action",
                  "status": "fail",
                  "weight": 2.5,
                  "detail": "No machine-readable action (priced Offer, OrderAction, ReserveAction or potentialAction) found.",
                  "rec": "Mark up the action an agent would take: a priced Offer (price + priceCurrency + availability), or an Action type (OrderAction, ReserveAction, potentialAction) with a valid absolute-URL target. An agent cannot transact against what it cannot read."
                },
                {
                  "label": "Offerings described",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No Product, Service or Offer markup for what you provide.",
                  "rec": "Describe what you offer with Product / Service / Offer schema so an agent can identify and select it."
                }
              ]
            },
            {
              "key": "operability",
              "label": "Operability",
              "weight": 0.28,
              "score": 75,
              "checks": [
                {
                  "label": "Form / task operability",
                  "status": "partial",
                  "weight": 2,
                  "detail": "1 form(s) with named inputs, but no action attribute: submission is wired in JavaScript, so a non-rendering agent has no endpoint to post to.",
                  "rec": "Provide real <form> elements with a real action attribute, named inputs and <label>/aria-label, and no honeypot trap, so an agent can read and complete the task. Forms wired only in JavaScript are invisible to non-rendering agents."
                },
                {
                  "label": "Static content (render dependency)",
                  "status": "pass",
                  "weight": 1.5,
                  "detail": "About 694 words of content are present in the static HTML.",
                  "rec": null
                },
                {
                  "label": "Machine-readable contact",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No machine-readable contact route for an agent hand-off.",
                  "rec": "Expose a ContactPoint in schema and a mailto:/tel: link so an agent can route a human when it reaches the limit of what it can do."
                },
                {
                  "label": "No CAPTCHA wall",
                  "status": "pass",
                  "weight": 1,
                  "detail": "No CAPTCHA challenge detected.",
                  "rec": null
                }
              ]
            },
            {
              "key": "discovery",
              "label": "Discoverability",
              "weight": 0.12,
              "score": 75,
              "checks": [
                {
                  "label": "Declared machine interface",
                  "status": "partial",
                  "weight": 0.5,
                  "detail": "No agent-facing interface declaration found.",
                  "rec": "As agent protocols settle, declare your agent-facing surfaces (in llms.txt today, and emerging well-known manifests). Scored lightly and forward-looking; not a ranking signal."
                },
                {
                  "label": "Discoverable sitemap",
                  "status": "pass",
                  "weight": 0.5,
                  "detail": "A sitemap is discoverable for agents to enumerate pages.",
                  "rec": null
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "warning",
              "label": "No machine-readable action found"
            }
          ],
          "renderDependent": false,
          "robotsUnmeasured": false
        },
        "representation": {
          "score": 8,
          "band": "Unresolved to machines",
          "categories": [
            {
              "key": "identity",
              "label": "Identity",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Entity definition",
                  "status": "fail",
                  "weight": 2,
                  "detail": "No Organisation, Brand or Person entity in structured data.",
                  "rec": "Declare an Organisation / Brand / Person with a description and depth fields (knowsAbout, areaServed, founder, foundingDate) so a model can build a faithful picture of who you are."
                },
                {
                  "label": "Identity consistency",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No entity name in schema to check for consistency.",
                  "rec": "Use one consistent name across schema, <title> and og:site_name, and declare a legal identifier (company number, VAT, or LEI) so a model can resolve you to a single, verifiable legal entity."
                }
              ]
            },
            {
              "key": "disambiguation",
              "label": "Disambiguation",
              "weight": 0.3,
              "score": 0,
              "checks": [
                {
                  "label": "Authoritative profiles linked",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No sameAs links to anchor your identity.",
                  "rec": "Declare at least two authoritative homes that resolve and reference you. Bot-walled links (uncheckable, e.g. LinkedIn) count for less than confirmed ones, so include a checkable registry (Wikidata, Companies House, OpenCorporates)."
                },
                {
                  "label": "Spans registry and profile",
                  "status": "fail",
                  "weight": 1,
                  "detail": "No authoritative links to span.",
                  "rec": "Link both a registry (Wikidata, Companies House, OpenCorporates, SEC, ORCID) that resolves and references you, and a profile (LinkedIn, Crunchbase, a verified social). Two of the same kind corroborate less than one of each."
                }
              ]
            },
            {
              "key": "authority",
              "label": "Authority",
              "weight": 0.25,
              "score": 0,
              "checks": [
                {
                  "label": "Credentialed authorship",
                  "status": "fail",
                  "weight": 1.5,
                  "detail": "No named, credentialed person or author; content reads as anonymous to a model.",
                  "rec": "Mark up the people behind the content as Person / author with jobTitle, worksFor, knowsAbout and sameAs. Models weigh named, credentialed authorship when deciding whose account of you to trust."
                },
                {
                  "label": "Citation-worthy claims",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Few extractable, quotable claims; little for a model to cite back to you.",
                  "rec": "Publish concrete, attributable claims: statistics, figures, defined terms and quotable statements. These are the units a model lifts, and lifting yours keeps the narrative in your words."
                },
                {
                  "label": "Sourced claims (outbound citations)",
                  "status": "fail",
                  "weight": 0.5,
                  "detail": "Claims are not backed by outbound links to sources a model can follow and trust.",
                  "rec": "Where you cite a figure or a study, link the source (an external, authoritative URL) from within the same paragraph. Sourced claims read as more citable than unbacked ones."
                }
              ]
            },
            {
              "key": "rights",
              "label": "Representation Rights",
              "weight": 0.15,
              "score": 50,
              "checks": [
                {
                  "label": "Representation & usage rights",
                  "status": "partial",
                  "weight": 1,
                  "detail": "No representation or usage terms declared (license, copyrightHolder, TDM reservation). (no training opt-out declared.)",
                  "rec": "State your terms so the machine layer knows how it may use your content: a schema license and copyrightHolder, and, if you wish to govern AI training/text-and-data-mining, a TDM reservation (/.well-known/tdmrep.json) or noai directive. Declaring terms is governance, not a penalty for any particular choice."
                }
              ]
            }
          ],
          "issues": [
            {
              "sev": "error",
              "label": "No machine-readable entity (Organisation / Brand / Person)"
            },
            {
              "sev": "warning",
              "label": "No authoritative sameAs links to disambiguate the entity"
            }
          ],
          "enrichment": {
            "sameAs": {
              "ran": true,
              "declared": 0,
              "reachable": 0,
              "confirmed": 0,
              "dead": 0,
              "links": [],
              "scoringHosts": []
            }
          },
          "tdmUnmeasured": false
        }
      },
      "serving": {
        "checked": true,
        "consistent": true,
        "note": "consistent"
      },
      "flags": []
    },
    {
      "name": "Birmingham Airport",
      "domain": "birminghamairport.co.uk",
      "ok": false,
      "reason": "BLOCKED (HTTP 403)",
      "wafVendor": "Cloudflare"
    },
    {
      "name": "Bristol Airport",
      "domain": "bristolairport.co.uk",
      "ok": false,
      "reason": "BLOCKED (HTTP 403)",
      "wafVendor": "Cloudflare"
    }
  ]
}