{"version":"1.0.0","url":"https://qibbopress.com/","finalUrl":"https://qibbopress.com/","host":"qibbopress.com","scannedAt":"2026-08-26T23:04:02.440Z","durationMs":54,"score":20,"grade":"F","potential":20,"gates":[{"id":"unreachable","cap":20,"reason":"The page did not return a successful response to a plain HTTP request, so nothing else on this report can help until it does."},{"id":"no-content","cap":62,"reason":"The content is assembled in the browser, so a crawling agent receives an empty document no matter how good the metadata is."}],"pillars":[{"pillar":"reachability","label":"Reachability","blurb":"Can an agent fetch your content at all, without a browser and without being blocked?","score":69,"earned":61.5,"available":89,"weight":25,"checks":[{"id":"http-ok","pillar":"reachability","title":"Page responds to a plain HTTP request","status":"fail","weight":10,"earned":0,"detail":"The request failed: fetch failed","why":"Agents fetch with a short timeout and no retry budget. A request that fails once is a page that does not exist as far as they are concerned.","fix":{"summary":"Make sure the URL resolves over HTTPS within a few seconds from outside your network."},"impact":2.8},{"id":"not-blocked","pillar":"reachability","title":"No bot wall in front of the content","status":"pass","weight":12,"earned":12,"detail":"The response body was the real page, not a challenge or block screen.","why":"Bot protection that cannot tell a shopping assistant from a scraper silently removes you from AI answers, with no error anyone on your team will ever see.","impact":0},{"id":"server-rendered","pillar":"reachability","title":"Content exists without running JavaScript","status":"fail","weight":14,"earned":0,"detail":"The raw HTML contains 0 words of text.","why":"This is the single most expensive AX failure. To a crawling agent the page is blank, so it cannot be summarised, cited or ranked at all.","fix":{"summary":"Render the page content on the server, or pre-render it at build time.","where":"Any SSR/SSG mode, or a prerender middleware that serves static HTML to bot user-agents."},"impact":3.9},{"id":"robots-exists","pillar":"reachability","title":"robots.txt is present and parseable","status":"warn","weight":4,"earned":2,"detail":"No robots.txt served (HTTP 0).","why":"Without a robots.txt every crawler applies its own defaults and you have no way to express a preference. It is also the file most agents read first.","fix":{"summary":"Publish a robots.txt that allows answer engines and points at your sitemap.","lang":"text","snippet":"User-agent: *\nAllow: /\n\nSitemap: https://example.com/sitemap.xml","where":"/robots.txt"},"quickWin":true,"impact":0.6},{"id":"robots-answer-engines","pillar":"reachability","title":"Answer engines are allowed to crawl","status":"pass","weight":12,"earned":12,"detail":"No robots.txt, so nothing is disallowed by default.","why":"These crawlers are the ones that put your link inside an AI answer. Blocking them removes the referral traffic, not just the training use.","impact":0},{"id":"robots-user-triggered","pillar":"reachability","title":"User-triggered fetchers are allowed","status":"pass","weight":8,"earned":8,"detail":"No robots.txt, so nothing is disallowed by default.","why":"These fetches happen because a human just pasted your link into an assistant. A block here fails in front of a real person who wanted to read you.","impact":0},{"id":"robots-search","pillar":"reachability","title":"Classic search crawlers are allowed","status":"pass","weight":6,"earned":6,"detail":"No robots.txt, so nothing is disallowed by default.","why":"AI Overviews and Copilot answers are grounded on the classic search index. Blocking Googlebot or Bingbot now also removes you from AI surfaces.","impact":0},{"id":"agent-live-probe","pillar":"reachability","title":"Real agent user-agents are served normally","status":"na","weight":8,"earned":8,"detail":"Live user-agent probing was not run for this scan.","why":"Some sites answer 200 to a generic client and 403 to a named AI crawler. Only a live probe finds that.","impact":0},{"id":"meta-robots","pillar":"reachability","title":"No directive suppressing AI use of this page","status":"pass","weight":6,"earned":6,"detail":"No robots meta tag or X-Robots-Tag header.","why":"noindex and nosnippet remove you from the surfaces that would otherwise quote and link you.","impact":0},{"id":"redirect-chain","pillar":"reachability","title":"Short redirect chain","status":"pass","weight":4,"earned":4,"detail":"The URL served content directly with no redirect.","why":"Every hop costs latency and some agents cap redirects at two or three.","impact":0},{"id":"response-speed","pillar":"reachability","title":"Responds fast enough for an agent budget","status":"pass","weight":5,"earned":5,"detail":"Full response in 12 ms.","why":"Agents fetch many pages per answer and drop the slow ones. Speed is a ranking input you control.","impact":0},{"id":"payload-weight","pillar":"reachability","title":"HTML payload stays inside an agent context budget","status":"pass","weight":5,"earned":5,"detail":"0 KB of HTML, 0% of it inline script.","why":"Agents truncate long documents. Anything past the cut simply is not read.","impact":0},{"id":"content-type","pillar":"reachability","title":"Declares a correct content type","status":"warn","weight":3,"earned":1.5,"detail":"No Content-Type header was returned.","why":"Agents use the header to decide whether to parse the body as HTML at all.","fix":{"summary":"Send `Content-Type: text/html; charset=utf-8`."},"quickWin":true,"impact":0.4}]},{"pillar":"comprehension","label":"Comprehension","blurb":"Once fetched, can the agent work out what this page is and what it says?","score":5,"earned":3,"available":64,"weight":25,"checks":[{"id":"title","pillar":"comprehension","title":"Has a descriptive <title>","status":"fail","weight":10,"earned":0,"detail":"The page has no <title> element, or it is empty.","why":"The title is the label an assistant uses when it lists you among its sources. Without one you are cited as a bare URL, which almost nobody clicks.","fix":{"summary":"Add a unique title of roughly 40-65 characters that names the thing and the site.","lang":"html","snippet":"<title>Agent Experience Scanner - AXRAY</title>"},"quickWin":true,"impact":3.9},{"id":"meta-description","pillar":"comprehension","title":"Has a meta description","status":"fail","weight":8,"earned":0,"detail":"No <meta name=\"description\"> on the page.","why":"It is the one sentence you get to write yourself. Without it the assistant summarises you from whatever text it happened to read first, which is often your cookie banner.","fix":{"summary":"Add a 120-160 character description that states what the page offers, in plain language.","lang":"html","snippet":"<meta name=\"description\" content=\"Scan any URL and see exactly what an AI agent can read, understand and act on. Get an AX score and a prioritised fix list.\">"},"quickWin":true,"impact":3.1},{"id":"h1","pillar":"comprehension","title":"Exactly one <h1> naming the page","status":"fail","weight":8,"earned":0,"detail":"The page has no headings at all.","why":"Without an h1 the agent has no anchor for the document topic and falls back to the title tag or the URL slug.","fix":{"summary":"Add a single <h1> at the top of the main content that states the page subject."},"quickWin":true,"impact":3.1},{"id":"heading-hierarchy","pillar":"comprehension","title":"Headings form a sane outline","status":"fail","weight":6,"earned":0,"detail":"Only 0 headings on the page.","why":"Agents chunk long pages by heading. A page with no outline is chunked arbitrarily and quoted out of context.","fix":{"summary":"Break the content into sections with <h2> headings that read as answers to real questions."},"quickWin":true,"impact":2.3},{"id":"content-volume","pillar":"comprehension","title":"Enough substance to be worth citing","status":"fail","weight":10,"earned":0,"detail":"Only 0 words of readable text reached the agent.","why":"There is not enough here for an assistant to build an answer from, so it will use someone else as the source.","fix":{"summary":"Make sure the real content is in the HTML, then make sure there is enough of it."},"impact":3.9},{"id":"text-ratio","pillar":"comprehension","title":"Signal-to-markup ratio","status":"fail","weight":8,"earned":0,"detail":"0.0% of the payload is readable text.","why":"The document is almost entirely machinery. An agent truncating this page will likely truncate before reaching any of your content.","fix":{"summary":"Reduce inline script and serialized state; aim for at least 12% readable text."},"impact":3.1},{"id":"lang","pillar":"comprehension","title":"Declares a document language","status":"fail","weight":5,"earned":0,"detail":"The <html> element has no lang attribute.","why":"Without it an assistant guesses the language, and guesses wrong on short or mixed-language pages, producing garbled quotes.","fix":{"summary":"Set the language on the root element.","lang":"html","snippet":"<html lang=\"en\">"},"quickWin":true,"impact":2},{"id":"image-alt","pillar":"comprehension","title":"Images carry alt text","status":"na","weight":8,"earned":8,"detail":"No content images on this page.","why":"Agents cannot see images. Alt text is the only description they get.","impact":0},{"id":"landmarks","pillar":"comprehension","title":"Main content is marked as such","status":"fail","weight":6,"earned":0,"detail":"No <main> element. Landmarks present: none.","why":"Without a main landmark an extractor has to guess your content boundary heuristically, and on marketing pages it usually guesses the header.","fix":{"summary":"Wrap the primary content in <main>, and each self-contained item in <article>.","lang":"html","snippet":"<main>\n  <article>\n    <h1>…</h1>\n    …\n  </article>\n</main>"},"quickWin":true,"impact":2.3},{"id":"semantic-density","pillar":"comprehension","title":"Uses semantic elements, not div soup","status":"na","weight":6,"earned":6,"detail":"Too few structural elements to judge.","why":"","impact":0},{"id":"noscript-fallback","pillar":"comprehension","title":"Provides a no-JavaScript fallback","status":"na","weight":4,"earned":4,"detail":"Not needed: the page already server-renders its content.","why":"","impact":0},{"id":"readable-url","pillar":"comprehension","title":"URL describes the content","status":"pass","weight":3,"earned":3,"detail":"Site root.","why":"Assistants show the URL next to the citation, and readable URLs get clicked more than opaque ids.","impact":0}]},{"pillar":"structure","label":"Structure","blurb":"Is the important data machine-readable instead of implied by visual layout?","score":15,"earned":5.1,"available":35,"weight":18,"checks":[{"id":"jsonld-present","pillar":"structure","title":"Ships structured data","status":"fail","weight":12,"earned":0,"detail":"No JSON-LD and no microdata anywhere on the page.","why":"Structured data is the only part of your page an agent can consume without interpretation. Everything else it has to infer, and inference is where it invents facts about you.","fix":{"summary":"Add a JSON-LD block describing what this page actually is.","lang":"html","where":"Inside <head>, one block per page.","snippet":"<script type=\"application/ld+json\">\n{\n  \"@context\": \"https://schema.org\",\n  \"@type\": \"Organization\",\n  \"name\": \"Your company\",\n  \"url\": \"https://example.com\",\n  \"description\": \"One sentence an assistant can quote.\",\n  \"sameAs\": [\"https://x.com/you\", \"https://github.com/you\"]\n}\n</script>"},"quickWin":true,"impact":6.2},{"id":"jsonld-valid","pillar":"structure","title":"Structured data parses cleanly","status":"na","weight":8,"earned":8,"detail":"No JSON-LD to validate.","why":"","impact":0},{"id":"jsonld-types","pillar":"structure","title":"Structured data describes the right thing","status":"na","weight":8,"earned":8,"detail":"No JSON-LD to evaluate.","why":"","impact":0},{"id":"open-graph","pillar":"structure","title":"Open Graph card is complete","status":"fail","weight":6,"earned":0.6,"detail":"Missing: og:title, og:description, og:type, og:url, og:image.","why":"When a page is JavaScript-heavy or truncated, Open Graph tags are frequently the only clean summary an agent gets.","fix":{"summary":"Add the four core Open Graph tags plus an image.","lang":"html","snippet":"<meta property=\"og:title\" content=\"Page title\">\n<meta property=\"og:description\" content=\"One sentence.\">\n<meta property=\"og:type\" content=\"website\">\n<meta property=\"og:url\" content=\"https://example.com/page\">\n<meta property=\"og:image\" content=\"https://example.com/og.png\">"},"quickWin":true,"impact":2.8},{"id":"canonical","pillar":"structure","title":"Declares a canonical URL","status":"warn","weight":6,"earned":3,"detail":"No <link rel=\"canonical\"> on the page.","why":"Agents dedupe sources by canonical URL. Without one, the same content behind different query strings competes with itself and dilutes every citation.","fix":{"summary":"Add a self-referencing canonical link to every page.","lang":"html","snippet":"<link rel=\"canonical\" href=\"https://qibbopress.com/\">"},"quickWin":true,"impact":1.5},{"id":"sitemap","pillar":"structure","title":"Publishes a sitemap","status":"fail","weight":8,"earned":0,"detail":"No sitemap found at https://qibbopress.com/sitemap_index.xml or in robots.txt.","why":"Without a sitemap, discovery depends entirely on crawlable links. Any page not reachable by a plain <a href> is invisible.","fix":{"summary":"Generate a sitemap.xml and reference it from robots.txt.","lang":"text","snippet":"Sitemap: https://example.com/sitemap.xml","where":"Append to /robots.txt"},"quickWin":true,"impact":4.1},{"id":"price-structured","pillar":"structure","title":"Prices are machine-readable","status":"na","weight":6,"earned":6,"detail":"No prices detected in the page text.","why":"","impact":0},{"id":"breadcrumbs","pillar":"structure","title":"Declares its place in the site","status":"na","weight":4,"earned":4,"detail":"Top-level page; breadcrumbs are not expected.","why":"","impact":0},{"id":"twitter-card","pillar":"structure","title":"Declares a link preview card","status":"warn","weight":3,"earned":1.5,"detail":"No twitter:* card tags.","why":"Several agents fall back to card metadata when they cannot extract the body reliably.","fix":{"summary":"Add a summary_large_image card.","lang":"html","snippet":"<meta name=\"twitter:card\" content=\"summary_large_image\">\n<meta name=\"twitter:title\" content=\"Page title\">\n<meta name=\"twitter:description\" content=\"One sentence.\">"},"quickWin":true,"impact":0.8},{"id":"microdata","pillar":"structure","title":"Inline microdata annotations","status":"na","weight":2,"earned":2,"detail":"No microdata; JSON-LD is the preferred format anyway.","why":"","impact":0}]},{"pillar":"actionability","label":"Actionability","blurb":"Can the agent take the next step - navigate, search, submit, buy - without guessing?","score":6,"earned":1.9,"available":33,"weight":17,"checks":[{"id":"links-crawlable","pillar":"actionability","title":"Navigation uses real links","status":"fail","weight":12,"earned":0,"detail":"The page contains no <a href> elements at all.","why":"An agent moves through a site by following hrefs. With none, this page is a dead end and everything behind it is undiscoverable.","fix":{"summary":"Render navigation as <a href=\"/real/path\"> elements, even in a single-page app."},"impact":6.2},{"id":"anchor-text","pillar":"actionability","title":"Link text describes the destination","status":"na","weight":8,"earned":8,"detail":"Too few links to judge.","why":"","impact":0},{"id":"internal-nav","pillar":"actionability","title":"Links onward into the site","status":"fail","weight":6,"earned":0,"detail":"Only 0 internal links on the page.","why":"A page with no onward links is a cul-de-sac. Everything you publish that is not linked from a crawlable page effectively does not exist.","fix":{"summary":"Add a server-rendered navigation and contextual links to related pages."},"impact":3.1},{"id":"form-labels","pillar":"actionability","title":"Form fields are labelled","status":"na","weight":8,"earned":8,"detail":"No interactive form fields on this page.","why":"","impact":0},{"id":"form-names","pillar":"actionability","title":"Form fields have stable names","status":"na","weight":6,"earned":6,"detail":"No interactive form fields on this page.","why":"","impact":0},{"id":"form-autocomplete","pillar":"actionability","title":"Fields declare autocomplete tokens","status":"na","weight":4,"earned":4,"detail":"No text-like fields on this page.","why":"","impact":0},{"id":"button-semantics","pillar":"actionability","title":"Controls are real buttons","status":"na","weight":6,"earned":6,"detail":"No button-like controls detected.","why":"","impact":0},{"id":"contact-affordance","pillar":"actionability","title":"Reachable by a human, discoverably","status":"fail","weight":5,"earned":0,"detail":"No mailto, tel, contact link or contactPoint data found.","why":"\"How do I get in touch with them\" is one of the most common agent-mediated questions about a company. Make the answer machine-readable.","fix":{"summary":"Add a contactPoint to your Organization schema and link a real contact page.","lang":"json","snippet":"{\"@type\":\"Organization\",\"contactPoint\":[{\"@type\":\"ContactPoint\",\"contactType\":\"customer support\",\"email\":\"support@example.com\",\"url\":\"https://example.com/contact\"}]}"},"quickWin":true,"impact":2.6},{"id":"search-affordance","pillar":"actionability","title":"Site search is machine-usable","status":"warn","weight":4,"earned":1,"detail":"No crawlable GET search form and no SearchAction.","why":"Without a GET-addressable search, an agent looking for one specific page on your site has to fetch dozens of pages to find it, and usually gives up first.","fix":{"summary":"Expose search at a GET URL like /search?q=… and declare it as a SearchAction."},"quickWin":true,"impact":1.5},{"id":"api-discovery","pillar":"actionability","title":"Programmatic surface is discoverable","status":"warn","weight":6,"earned":0.9,"detail":"No well-known agent manifest, no OpenAPI reference and no developer docs link found.","why":"This is the frontier of AX: sites that publish a machine-callable surface get used by agents directly instead of being scraped approximately.","fix":{"summary":"Publish a minimal agent manifest describing what you offer and where to call it.","where":"/.well-known/mcp.json","lang":"json","snippet":"{\n  \"name\": \"Example\",\n  \"description\": \"What an agent can do with this service.\",\n  \"documentation\": \"https://example.com/docs\",\n  \"endpoints\": [\n    { \"type\": \"openapi\", \"url\": \"https://example.com/openapi.json\" }\n  ]\n}"},"quickWin":true,"impact":2.6}]},{"pillar":"contract","label":"Agent Contract","blurb":"Have you told agents the rules: what they may use, where the docs are, who to contact?","score":7,"earned":3.3,"available":45,"weight":15,"checks":[{"id":"llms-txt","pillar":"contract","title":"Publishes an llms.txt","status":"fail","weight":14,"earned":0,"detail":"No /llms.txt or /llms-full.txt at https://qibbopress.com.","why":"Without it, an assistant deciding what your site is about crawls whatever it happens to find. llms.txt is the cheapest way to control that first impression, and today most of your competitors do not have one either.","fix":{"summary":"Publish an llms.txt: a title, one paragraph, then curated links grouped by intent.","where":"/llms.txt","lang":"markdown","snippet":"# Example Inc\n\n> One paragraph an assistant can quote verbatim about what you do and who it is for.\n\n## Docs\n- [Quickstart](https://example.com/docs/quickstart): Get running in five minutes.\n- [API reference](https://example.com/docs/api): Every endpoint with examples.\n\n## Product\n- [Pricing](https://example.com/pricing): Plans, limits and exact prices.\n- [Changelog](https://example.com/changelog): What shipped, newest first.\n\n## Policies\n- [Terms](https://example.com/terms)\n- [Contact](https://example.com/contact): support@example.com"},"quickWin":true,"impact":4.7},{"id":"llms-txt-quality","pillar":"contract","title":"llms.txt is actually useful","status":"na","weight":6,"earned":6,"detail":"No llms.txt to evaluate.","why":"","impact":0},{"id":"ai-policy","pillar":"contract","title":"States an explicit AI policy","status":"warn","weight":6,"earned":1.5,"detail":"robots.txt has no per-agent AI groups, and there is no TDM reservation or noai directive anywhere.","why":"With no explicit policy, every operator applies its own default to you and you have no documented position if you later object.","fix":{"summary":"Say what you want, per crawler. Allow the ones that send traffic; decide separately about the training ones.","where":"/robots.txt","lang":"text","snippet":"# Answer engines: allowed, they cite and link us.\nUser-agent: OAI-SearchBot\nUser-agent: PerplexityBot\nUser-agent: Claude-SearchBot\nUser-agent: DuckAssistBot\nAllow: /\n\n# User-triggered fetches: allowed, a person is waiting.\nUser-agent: ChatGPT-User\nUser-agent: Claude-User\nUser-agent: Perplexity-User\nAllow: /\n\n# Training crawlers: your call. This example allows them.\nUser-agent: GPTBot\nUser-agent: ClaudeBot\nUser-agent: Google-Extended\nAllow: /"},"quickWin":true,"impact":1.5},{"id":"mcp-manifest","pillar":"contract","title":"Exposes an agent-callable manifest","status":"fail","weight":6,"earned":0,"detail":"No /.well-known/mcp.json and no ai-plugin.json.","why":"This is the highest-leverage unclaimed slot on the web right now. The sites that publish a callable surface get used directly instead of guessed at.","fix":{"summary":"Publish a manifest naming what an agent can do with you and where to call it.","where":"/.well-known/mcp.json","lang":"json","snippet":"{\n  \"schema_version\": \"2025-06-18\",\n  \"name\": \"example\",\n  \"description\": \"Search the catalogue and check availability.\",\n  \"documentation\": \"https://example.com/docs\",\n  \"servers\": [\n    { \"type\": \"http\", \"url\": \"https://mcp.example.com\" }\n  ],\n  \"contact\": \"support@example.com\"\n}"},"impact":2},{"id":"identity","pillar":"contract","title":"Identity is machine-verifiable","status":"fail","weight":5,"earned":0,"detail":"No Organization structured data on the page.","why":"Entity resolution is how assistants decide two mentions are the same company. Unresolved entities get merged with, or mistaken for, someone else.","fix":{"summary":"Publish Organization data with sameAs links to your verified profiles.","lang":"json","snippet":"{\"@context\":\"https://schema.org\",\"@type\":\"Organization\",\"name\":\"Example Inc\",\"url\":\"https://example.com\",\"logo\":\"https://example.com/logo.png\",\"sameAs\":[\"https://x.com/example\",\"https://github.com/example\",\"https://www.linkedin.com/company/example\"]}"},"quickWin":true,"impact":1.7},{"id":"freshness","pillar":"contract","title":"Says when the content changed","status":"warn","weight":5,"earned":0,"detail":"No Last-Modified, ETag, dateModified or <time> element anywhere.","why":"Agents deprioritise content they cannot date, and re-fetch undated pages more often, which costs you bandwidth for nothing.","fix":{"summary":"Send Last-Modified and ETag, and publish dateModified in your structured data.","lang":"json","snippet":"{\"@type\":\"Article\",\"datePublished\":\"2026-01-15\",\"dateModified\":\"2026-08-01\"}"},"quickWin":true,"impact":1.7},{"id":"licence-signal","pillar":"contract","title":"Declares content licensing","status":"warn","weight":5,"earned":1,"detail":"No rel=\"license\" link and no license or copyright fields in structured data.","why":"If you care how your content is reused, say so where machines can read it. A footer copyright line is not machine-readable.","fix":{"summary":"Declare the licence on the page and in your structured data.","lang":"html","snippet":"<link rel=\"license\" href=\"https://example.com/terms\">"},"quickWin":true,"impact":1.3},{"id":"security-txt","pillar":"contract","title":"Publishes security.txt","status":"warn","weight":4,"earned":0.8,"detail":"No /.well-known/security.txt.","why":"It is the standard machine-readable place to say who to contact. Agents and researchers both look there first.","fix":{"summary":"Add a security.txt with a contact address and an expiry date.","where":"/.well-known/security.txt","lang":"text","snippet":"Contact: mailto:security@example.com\nExpires: 2027-01-01T00:00:00.000Z\nPreferred-Languages: en"},"quickWin":true,"impact":1.1}]}],"checks":[{"id":"http-ok","pillar":"reachability","title":"Page responds to a plain HTTP request","status":"fail","weight":10,"earned":0,"detail":"The request failed: fetch failed","why":"Agents fetch with a short timeout and no retry budget. A request that fails once is a page that does not exist as far as they are concerned.","fix":{"summary":"Make sure the URL resolves over HTTPS within a few seconds from outside your network."},"impact":2.8},{"id":"not-blocked","pillar":"reachability","title":"No bot wall in front of the content","status":"pass","weight":12,"earned":12,"detail":"The response body was the real page, not a challenge or block screen.","why":"Bot protection that cannot tell a shopping assistant from a scraper silently removes you from AI answers, with no error anyone on your team will ever see.","impact":0},{"id":"server-rendered","pillar":"reachability","title":"Content exists without running JavaScript","status":"fail","weight":14,"earned":0,"detail":"The raw HTML contains 0 words of text.","why":"This is the single most expensive AX failure. To a crawling agent the page is blank, so it cannot be summarised, cited or ranked at all.","fix":{"summary":"Render the page content on the server, or pre-render it at build time.","where":"Any SSR/SSG mode, or a prerender middleware that serves static HTML to bot user-agents."},"impact":3.9},{"id":"robots-exists","pillar":"reachability","title":"robots.txt is present and parseable","status":"warn","weight":4,"earned":2,"detail":"No robots.txt served (HTTP 0).","why":"Without a robots.txt every crawler applies its own defaults and you have no way to express a preference. It is also the file most agents read first.","fix":{"summary":"Publish a robots.txt that allows answer engines and points at your sitemap.","lang":"text","snippet":"User-agent: *\nAllow: /\n\nSitemap: https://example.com/sitemap.xml","where":"/robots.txt"},"quickWin":true,"impact":0.6},{"id":"robots-answer-engines","pillar":"reachability","title":"Answer engines are allowed to crawl","status":"pass","weight":12,"earned":12,"detail":"No robots.txt, so nothing is disallowed by default.","why":"These crawlers are the ones that put your link inside an AI answer. Blocking them removes the referral traffic, not just the training use.","impact":0},{"id":"robots-user-triggered","pillar":"reachability","title":"User-triggered fetchers are allowed","status":"pass","weight":8,"earned":8,"detail":"No robots.txt, so nothing is disallowed by default.","why":"These fetches happen because a human just pasted your link into an assistant. A block here fails in front of a real person who wanted to read you.","impact":0},{"id":"robots-search","pillar":"reachability","title":"Classic search crawlers are allowed","status":"pass","weight":6,"earned":6,"detail":"No robots.txt, so nothing is disallowed by default.","why":"AI Overviews and Copilot answers are grounded on the classic search index. Blocking Googlebot or Bingbot now also removes you from AI surfaces.","impact":0},{"id":"agent-live-probe","pillar":"reachability","title":"Real agent user-agents are served normally","status":"na","weight":8,"earned":8,"detail":"Live user-agent probing was not run for this scan.","why":"Some sites answer 200 to a generic client and 403 to a named AI crawler. Only a live probe finds that.","impact":0},{"id":"meta-robots","pillar":"reachability","title":"No directive suppressing AI use of this page","status":"pass","weight":6,"earned":6,"detail":"No robots meta tag or X-Robots-Tag header.","why":"noindex and nosnippet remove you from the surfaces that would otherwise quote and link you.","impact":0},{"id":"redirect-chain","pillar":"reachability","title":"Short redirect chain","status":"pass","weight":4,"earned":4,"detail":"The URL served content directly with no redirect.","why":"Every hop costs latency and some agents cap redirects at two or three.","impact":0},{"id":"response-speed","pillar":"reachability","title":"Responds fast enough for an agent budget","status":"pass","weight":5,"earned":5,"detail":"Full response in 12 ms.","why":"Agents fetch many pages per answer and drop the slow ones. Speed is a ranking input you control.","impact":0},{"id":"payload-weight","pillar":"reachability","title":"HTML payload stays inside an agent context budget","status":"pass","weight":5,"earned":5,"detail":"0 KB of HTML, 0% of it inline script.","why":"Agents truncate long documents. Anything past the cut simply is not read.","impact":0},{"id":"content-type","pillar":"reachability","title":"Declares a correct content type","status":"warn","weight":3,"earned":1.5,"detail":"No Content-Type header was returned.","why":"Agents use the header to decide whether to parse the body as HTML at all.","fix":{"summary":"Send `Content-Type: text/html; charset=utf-8`."},"quickWin":true,"impact":0.4},{"id":"title","pillar":"comprehension","title":"Has a descriptive <title>","status":"fail","weight":10,"earned":0,"detail":"The page has no <title> element, or it is empty.","why":"The title is the label an assistant uses when it lists you among its sources. Without one you are cited as a bare URL, which almost nobody clicks.","fix":{"summary":"Add a unique title of roughly 40-65 characters that names the thing and the site.","lang":"html","snippet":"<title>Agent Experience Scanner - AXRAY</title>"},"quickWin":true,"impact":3.9},{"id":"meta-description","pillar":"comprehension","title":"Has a meta description","status":"fail","weight":8,"earned":0,"detail":"No <meta name=\"description\"> on the page.","why":"It is the one sentence you get to write yourself. Without it the assistant summarises you from whatever text it happened to read first, which is often your cookie banner.","fix":{"summary":"Add a 120-160 character description that states what the page offers, in plain language.","lang":"html","snippet":"<meta name=\"description\" content=\"Scan any URL and see exactly what an AI agent can read, understand and act on. Get an AX score and a prioritised fix list.\">"},"quickWin":true,"impact":3.1},{"id":"h1","pillar":"comprehension","title":"Exactly one <h1> naming the page","status":"fail","weight":8,"earned":0,"detail":"The page has no headings at all.","why":"Without an h1 the agent has no anchor for the document topic and falls back to the title tag or the URL slug.","fix":{"summary":"Add a single <h1> at the top of the main content that states the page subject."},"quickWin":true,"impact":3.1},{"id":"heading-hierarchy","pillar":"comprehension","title":"Headings form a sane outline","status":"fail","weight":6,"earned":0,"detail":"Only 0 headings on the page.","why":"Agents chunk long pages by heading. A page with no outline is chunked arbitrarily and quoted out of context.","fix":{"summary":"Break the content into sections with <h2> headings that read as answers to real questions."},"quickWin":true,"impact":2.3},{"id":"content-volume","pillar":"comprehension","title":"Enough substance to be worth citing","status":"fail","weight":10,"earned":0,"detail":"Only 0 words of readable text reached the agent.","why":"There is not enough here for an assistant to build an answer from, so it will use someone else as the source.","fix":{"summary":"Make sure the real content is in the HTML, then make sure there is enough of it."},"impact":3.9},{"id":"text-ratio","pillar":"comprehension","title":"Signal-to-markup ratio","status":"fail","weight":8,"earned":0,"detail":"0.0% of the payload is readable text.","why":"The document is almost entirely machinery. An agent truncating this page will likely truncate before reaching any of your content.","fix":{"summary":"Reduce inline script and serialized state; aim for at least 12% readable text."},"impact":3.1},{"id":"lang","pillar":"comprehension","title":"Declares a document language","status":"fail","weight":5,"earned":0,"detail":"The <html> element has no lang attribute.","why":"Without it an assistant guesses the language, and guesses wrong on short or mixed-language pages, producing garbled quotes.","fix":{"summary":"Set the language on the root element.","lang":"html","snippet":"<html lang=\"en\">"},"quickWin":true,"impact":2},{"id":"image-alt","pillar":"comprehension","title":"Images carry alt text","status":"na","weight":8,"earned":8,"detail":"No content images on this page.","why":"Agents cannot see images. Alt text is the only description they get.","impact":0},{"id":"landmarks","pillar":"comprehension","title":"Main content is marked as such","status":"fail","weight":6,"earned":0,"detail":"No <main> element. Landmarks present: none.","why":"Without a main landmark an extractor has to guess your content boundary heuristically, and on marketing pages it usually guesses the header.","fix":{"summary":"Wrap the primary content in <main>, and each self-contained item in <article>.","lang":"html","snippet":"<main>\n  <article>\n    <h1>…</h1>\n    …\n  </article>\n</main>"},"quickWin":true,"impact":2.3},{"id":"semantic-density","pillar":"comprehension","title":"Uses semantic elements, not div soup","status":"na","weight":6,"earned":6,"detail":"Too few structural elements to judge.","why":"","impact":0},{"id":"noscript-fallback","pillar":"comprehension","title":"Provides a no-JavaScript fallback","status":"na","weight":4,"earned":4,"detail":"Not needed: the page already server-renders its content.","why":"","impact":0},{"id":"readable-url","pillar":"comprehension","title":"URL describes the content","status":"pass","weight":3,"earned":3,"detail":"Site root.","why":"Assistants show the URL next to the citation, and readable URLs get clicked more than opaque ids.","impact":0},{"id":"jsonld-present","pillar":"structure","title":"Ships structured data","status":"fail","weight":12,"earned":0,"detail":"No JSON-LD and no microdata anywhere on the page.","why":"Structured data is the only part of your page an agent can consume without interpretation. Everything else it has to infer, and inference is where it invents facts about you.","fix":{"summary":"Add a JSON-LD block describing what this page actually is.","lang":"html","where":"Inside <head>, one block per page.","snippet":"<script type=\"application/ld+json\">\n{\n  \"@context\": \"https://schema.org\",\n  \"@type\": \"Organization\",\n  \"name\": \"Your company\",\n  \"url\": \"https://example.com\",\n  \"description\": \"One sentence an assistant can quote.\",\n  \"sameAs\": [\"https://x.com/you\", \"https://github.com/you\"]\n}\n</script>"},"quickWin":true,"impact":6.2},{"id":"jsonld-valid","pillar":"structure","title":"Structured data parses cleanly","status":"na","weight":8,"earned":8,"detail":"No JSON-LD to validate.","why":"","impact":0},{"id":"jsonld-types","pillar":"structure","title":"Structured data describes the right thing","status":"na","weight":8,"earned":8,"detail":"No JSON-LD to evaluate.","why":"","impact":0},{"id":"open-graph","pillar":"structure","title":"Open Graph card is complete","status":"fail","weight":6,"earned":0.6,"detail":"Missing: og:title, og:description, og:type, og:url, og:image.","why":"When a page is JavaScript-heavy or truncated, Open Graph tags are frequently the only clean summary an agent gets.","fix":{"summary":"Add the four core Open Graph tags plus an image.","lang":"html","snippet":"<meta property=\"og:title\" content=\"Page title\">\n<meta property=\"og:description\" content=\"One sentence.\">\n<meta property=\"og:type\" content=\"website\">\n<meta property=\"og:url\" content=\"https://example.com/page\">\n<meta property=\"og:image\" content=\"https://example.com/og.png\">"},"quickWin":true,"impact":2.8},{"id":"canonical","pillar":"structure","title":"Declares a canonical URL","status":"warn","weight":6,"earned":3,"detail":"No <link rel=\"canonical\"> on the page.","why":"Agents dedupe sources by canonical URL. Without one, the same content behind different query strings competes with itself and dilutes every citation.","fix":{"summary":"Add a self-referencing canonical link to every page.","lang":"html","snippet":"<link rel=\"canonical\" href=\"https://qibbopress.com/\">"},"quickWin":true,"impact":1.5},{"id":"sitemap","pillar":"structure","title":"Publishes a sitemap","status":"fail","weight":8,"earned":0,"detail":"No sitemap found at https://qibbopress.com/sitemap_index.xml or in robots.txt.","why":"Without a sitemap, discovery depends entirely on crawlable links. Any page not reachable by a plain <a href> is invisible.","fix":{"summary":"Generate a sitemap.xml and reference it from robots.txt.","lang":"text","snippet":"Sitemap: https://example.com/sitemap.xml","where":"Append to /robots.txt"},"quickWin":true,"impact":4.1},{"id":"price-structured","pillar":"structure","title":"Prices are machine-readable","status":"na","weight":6,"earned":6,"detail":"No prices detected in the page text.","why":"","impact":0},{"id":"breadcrumbs","pillar":"structure","title":"Declares its place in the site","status":"na","weight":4,"earned":4,"detail":"Top-level page; breadcrumbs are not expected.","why":"","impact":0},{"id":"twitter-card","pillar":"structure","title":"Declares a link preview card","status":"warn","weight":3,"earned":1.5,"detail":"No twitter:* card tags.","why":"Several agents fall back to card metadata when they cannot extract the body reliably.","fix":{"summary":"Add a summary_large_image card.","lang":"html","snippet":"<meta name=\"twitter:card\" content=\"summary_large_image\">\n<meta name=\"twitter:title\" content=\"Page title\">\n<meta name=\"twitter:description\" content=\"One sentence.\">"},"quickWin":true,"impact":0.8},{"id":"microdata","pillar":"structure","title":"Inline microdata annotations","status":"na","weight":2,"earned":2,"detail":"No microdata; JSON-LD is the preferred format anyway.","why":"","impact":0},{"id":"links-crawlable","pillar":"actionability","title":"Navigation uses real links","status":"fail","weight":12,"earned":0,"detail":"The page contains no <a href> elements at all.","why":"An agent moves through a site by following hrefs. With none, this page is a dead end and everything behind it is undiscoverable.","fix":{"summary":"Render navigation as <a href=\"/real/path\"> elements, even in a single-page app."},"impact":6.2},{"id":"anchor-text","pillar":"actionability","title":"Link text describes the destination","status":"na","weight":8,"earned":8,"detail":"Too few links to judge.","why":"","impact":0},{"id":"internal-nav","pillar":"actionability","title":"Links onward into the site","status":"fail","weight":6,"earned":0,"detail":"Only 0 internal links on the page.","why":"A page with no onward links is a cul-de-sac. Everything you publish that is not linked from a crawlable page effectively does not exist.","fix":{"summary":"Add a server-rendered navigation and contextual links to related pages."},"impact":3.1},{"id":"form-labels","pillar":"actionability","title":"Form fields are labelled","status":"na","weight":8,"earned":8,"detail":"No interactive form fields on this page.","why":"","impact":0},{"id":"form-names","pillar":"actionability","title":"Form fields have stable names","status":"na","weight":6,"earned":6,"detail":"No interactive form fields on this page.","why":"","impact":0},{"id":"form-autocomplete","pillar":"actionability","title":"Fields declare autocomplete tokens","status":"na","weight":4,"earned":4,"detail":"No text-like fields on this page.","why":"","impact":0},{"id":"button-semantics","pillar":"actionability","title":"Controls are real buttons","status":"na","weight":6,"earned":6,"detail":"No button-like controls detected.","why":"","impact":0},{"id":"contact-affordance","pillar":"actionability","title":"Reachable by a human, discoverably","status":"fail","weight":5,"earned":0,"detail":"No mailto, tel, contact link or contactPoint data found.","why":"\"How do I get in touch with them\" is one of the most common agent-mediated questions about a company. Make the answer machine-readable.","fix":{"summary":"Add a contactPoint to your Organization schema and link a real contact page.","lang":"json","snippet":"{\"@type\":\"Organization\",\"contactPoint\":[{\"@type\":\"ContactPoint\",\"contactType\":\"customer support\",\"email\":\"support@example.com\",\"url\":\"https://example.com/contact\"}]}"},"quickWin":true,"impact":2.6},{"id":"search-affordance","pillar":"actionability","title":"Site search is machine-usable","status":"warn","weight":4,"earned":1,"detail":"No crawlable GET search form and no SearchAction.","why":"Without a GET-addressable search, an agent looking for one specific page on your site has to fetch dozens of pages to find it, and usually gives up first.","fix":{"summary":"Expose search at a GET URL like /search?q=… and declare it as a SearchAction."},"quickWin":true,"impact":1.5},{"id":"api-discovery","pillar":"actionability","title":"Programmatic surface is discoverable","status":"warn","weight":6,"earned":0.9,"detail":"No well-known agent manifest, no OpenAPI reference and no developer docs link found.","why":"This is the frontier of AX: sites that publish a machine-callable surface get used by agents directly instead of being scraped approximately.","fix":{"summary":"Publish a minimal agent manifest describing what you offer and where to call it.","where":"/.well-known/mcp.json","lang":"json","snippet":"{\n  \"name\": \"Example\",\n  \"description\": \"What an agent can do with this service.\",\n  \"documentation\": \"https://example.com/docs\",\n  \"endpoints\": [\n    { \"type\": \"openapi\", \"url\": \"https://example.com/openapi.json\" }\n  ]\n}"},"quickWin":true,"impact":2.6},{"id":"llms-txt","pillar":"contract","title":"Publishes an llms.txt","status":"fail","weight":14,"earned":0,"detail":"No /llms.txt or /llms-full.txt at https://qibbopress.com.","why":"Without it, an assistant deciding what your site is about crawls whatever it happens to find. llms.txt is the cheapest way to control that first impression, and today most of your competitors do not have one either.","fix":{"summary":"Publish an llms.txt: a title, one paragraph, then curated links grouped by intent.","where":"/llms.txt","lang":"markdown","snippet":"# Example Inc\n\n> One paragraph an assistant can quote verbatim about what you do and who it is for.\n\n## Docs\n- [Quickstart](https://example.com/docs/quickstart): Get running in five minutes.\n- [API reference](https://example.com/docs/api): Every endpoint with examples.\n\n## Product\n- [Pricing](https://example.com/pricing): Plans, limits and exact prices.\n- [Changelog](https://example.com/changelog): What shipped, newest first.\n\n## Policies\n- [Terms](https://example.com/terms)\n- [Contact](https://example.com/contact): support@example.com"},"quickWin":true,"impact":4.7},{"id":"llms-txt-quality","pillar":"contract","title":"llms.txt is actually useful","status":"na","weight":6,"earned":6,"detail":"No llms.txt to evaluate.","why":"","impact":0},{"id":"ai-policy","pillar":"contract","title":"States an explicit AI policy","status":"warn","weight":6,"earned":1.5,"detail":"robots.txt has no per-agent AI groups, and there is no TDM reservation or noai directive anywhere.","why":"With no explicit policy, every operator applies its own default to you and you have no documented position if you later object.","fix":{"summary":"Say what you want, per crawler. Allow the ones that send traffic; decide separately about the training ones.","where":"/robots.txt","lang":"text","snippet":"# Answer engines: allowed, they cite and link us.\nUser-agent: OAI-SearchBot\nUser-agent: PerplexityBot\nUser-agent: Claude-SearchBot\nUser-agent: DuckAssistBot\nAllow: /\n\n# User-triggered fetches: allowed, a person is waiting.\nUser-agent: ChatGPT-User\nUser-agent: Claude-User\nUser-agent: Perplexity-User\nAllow: /\n\n# Training crawlers: your call. This example allows them.\nUser-agent: GPTBot\nUser-agent: ClaudeBot\nUser-agent: Google-Extended\nAllow: /"},"quickWin":true,"impact":1.5},{"id":"mcp-manifest","pillar":"contract","title":"Exposes an agent-callable manifest","status":"fail","weight":6,"earned":0,"detail":"No /.well-known/mcp.json and no ai-plugin.json.","why":"This is the highest-leverage unclaimed slot on the web right now. The sites that publish a callable surface get used directly instead of guessed at.","fix":{"summary":"Publish a manifest naming what an agent can do with you and where to call it.","where":"/.well-known/mcp.json","lang":"json","snippet":"{\n  \"schema_version\": \"2025-06-18\",\n  \"name\": \"example\",\n  \"description\": \"Search the catalogue and check availability.\",\n  \"documentation\": \"https://example.com/docs\",\n  \"servers\": [\n    { \"type\": \"http\", \"url\": \"https://mcp.example.com\" }\n  ],\n  \"contact\": \"support@example.com\"\n}"},"impact":2},{"id":"identity","pillar":"contract","title":"Identity is machine-verifiable","status":"fail","weight":5,"earned":0,"detail":"No Organization structured data on the page.","why":"Entity resolution is how assistants decide two mentions are the same company. Unresolved entities get merged with, or mistaken for, someone else.","fix":{"summary":"Publish Organization data with sameAs links to your verified profiles.","lang":"json","snippet":"{\"@context\":\"https://schema.org\",\"@type\":\"Organization\",\"name\":\"Example Inc\",\"url\":\"https://example.com\",\"logo\":\"https://example.com/logo.png\",\"sameAs\":[\"https://x.com/example\",\"https://github.com/example\",\"https://www.linkedin.com/company/example\"]}"},"quickWin":true,"impact":1.7},{"id":"freshness","pillar":"contract","title":"Says when the content changed","status":"warn","weight":5,"earned":0,"detail":"No Last-Modified, ETag, dateModified or <time> element anywhere.","why":"Agents deprioritise content they cannot date, and re-fetch undated pages more often, which costs you bandwidth for nothing.","fix":{"summary":"Send Last-Modified and ETag, and publish dateModified in your structured data.","lang":"json","snippet":"{\"@type\":\"Article\",\"datePublished\":\"2026-01-15\",\"dateModified\":\"2026-08-01\"}"},"quickWin":true,"impact":1.7},{"id":"licence-signal","pillar":"contract","title":"Declares content licensing","status":"warn","weight":5,"earned":1,"detail":"No rel=\"license\" link and no license or copyright fields in structured data.","why":"If you care how your content is reused, say so where machines can read it. A footer copyright line is not machine-readable.","fix":{"summary":"Declare the licence on the page and in your structured data.","lang":"html","snippet":"<link rel=\"license\" href=\"https://example.com/terms\">"},"quickWin":true,"impact":1.3},{"id":"security-txt","pillar":"contract","title":"Publishes security.txt","status":"warn","weight":4,"earned":0.8,"detail":"No /.well-known/security.txt.","why":"It is the standard machine-readable place to say who to contact. Agents and researchers both look there first.","fix":{"summary":"Add a security.txt with a contact address and an expiry date.","where":"/.well-known/security.txt","lang":"text","snippet":"Contact: mailto:security@example.com\nExpires: 2027-01-01T00:00:00.000Z\nPreferred-Languages: en"},"quickWin":true,"impact":1.1}],"agents":[{"name":"OAI-SearchBot","userAgent":"Mozilla/5.0 (compatible; OAI-SearchBot/1.0; +https://openai.com/searchbot)","robotsAllowed":null},{"name":"ChatGPT-User","userAgent":"Mozilla/5.0 (compatible; ChatGPT-User/1.0; +https://openai.com/bot)","robotsAllowed":null},{"name":"GPTBot","userAgent":"Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; GPTBot/1.2; +https://openai.com/gptbot)","robotsAllowed":null},{"name":"ClaudeBot","userAgent":"Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)","robotsAllowed":null},{"name":"Claude-User","userAgent":"Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Claude-User/1.0; +Claude-User@anthropic.com)","robotsAllowed":null},{"name":"Claude-SearchBot","userAgent":"Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Claude-SearchBot/1.0; +Claude-SearchBot@anthropic.com)","robotsAllowed":null},{"name":"PerplexityBot","userAgent":"Mozilla/5.0 (compatible; PerplexityBot/1.0; +https://perplexity.ai/perplexitybot)","robotsAllowed":null},{"name":"Perplexity-User","userAgent":"Mozilla/5.0 (compatible; Perplexity-User/1.0; +https://perplexity.ai/perplexity-user)","robotsAllowed":null},{"name":"Google-Extended","userAgent":"Mozilla/5.0 (compatible; Google-Extended/1.0)","robotsAllowed":null},{"name":"Googlebot","userAgent":"Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)","robotsAllowed":null},{"name":"Bingbot","userAgent":"Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)","robotsAllowed":null},{"name":"Applebot-Extended","userAgent":"Mozilla/5.0 (compatible; Applebot-Extended/1.0)","robotsAllowed":null},{"name":"meta-externalagent","userAgent":"meta-externalagent/1.1 (+https://developers.facebook.com/docs/sharing/webmasters/crawler)","robotsAllowed":null},{"name":"Amazonbot","userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 (compatible; Amazonbot/0.1; +https://developer.amazon.com/support/amazonbot)","robotsAllowed":null},{"name":"CCBot","userAgent":"CCBot/2.0 (https://commoncrawl.org/faq/)","robotsAllowed":null},{"name":"DuckAssistBot","userAgent":"Mozilla/5.0 (compatible; DuckAssistBot/1.0; +https://duckduckgo.com/duckassistbot/)","robotsAllowed":null}],"fetch":{"url":"https://qibbopress.com/","status":0,"ms":12,"bytes":0,"contentType":"","redirects":[],"headers":{},"ok":false,"error":"fetch failed"},"facts":{"title":"","metaDescription":"","lang":"","canonical":"","wordCount":0,"textRatio":0,"looksClientRendered":false,"frameworkHints":[],"scriptBytes":0,"htmlBytes":0},"site":{"origin":"https://qibbopress.com","robotsTxt":{"found":false,"status":0,"body":"","sitemaps":[]},"sitemap":{"found":false,"status":0,"urlCount":0,"url":"https://qibbopress.com/sitemap_index.xml"},"llmsTxt":{"found":false,"status":0,"body":"","url":"https://qibbopress.com/llms.txt","sectionCount":0,"linkCount":0},"feeds":[],"wellKnown":{"/.well-known/security.txt":{"found":false,"status":0},"/.well-known/ai-plugin.json":{"found":false,"status":0},"/.well-known/mcp.json":{"found":false,"status":0},"/.well-known/apple-app-site-association":{"found":false,"status":0},"/.well-known/agent.json":{"found":false,"status":0}},"openapi":[],"mcp":{"found":false,"url":"https://qibbopress.com/.well-known/mcp.json"}},"priorities":[{"id":"jsonld-present","pillar":"structure","title":"Ships structured data","status":"fail","weight":12,"earned":0,"detail":"No JSON-LD and no microdata anywhere on the page.","why":"Structured data is the only part of your page an agent can consume without interpretation. Everything else it has to infer, and inference is where it invents facts about you.","fix":{"summary":"Add a JSON-LD block describing what this page actually is.","lang":"html","where":"Inside <head>, one block per page.","snippet":"<script type=\"application/ld+json\">\n{\n  \"@context\": \"https://schema.org\",\n  \"@type\": \"Organization\",\n  \"name\": \"Your company\",\n  \"url\": \"https://example.com\",\n  \"description\": \"One sentence an assistant can quote.\",\n  \"sameAs\": [\"https://x.com/you\", \"https://github.com/you\"]\n}\n</script>"},"quickWin":true,"impact":6.2},{"id":"links-crawlable","pillar":"actionability","title":"Navigation uses real links","status":"fail","weight":12,"earned":0,"detail":"The page contains no <a href> elements at all.","why":"An agent moves through a site by following hrefs. With none, this page is a dead end and everything behind it is undiscoverable.","fix":{"summary":"Render navigation as <a href=\"/real/path\"> elements, even in a single-page app."},"impact":6.2},{"id":"llms-txt","pillar":"contract","title":"Publishes an llms.txt","status":"fail","weight":14,"earned":0,"detail":"No /llms.txt or /llms-full.txt at https://qibbopress.com.","why":"Without it, an assistant deciding what your site is about crawls whatever it happens to find. llms.txt is the cheapest way to control that first impression, and today most of your competitors do not have one either.","fix":{"summary":"Publish an llms.txt: a title, one paragraph, then curated links grouped by intent.","where":"/llms.txt","lang":"markdown","snippet":"# Example Inc\n\n> One paragraph an assistant can quote verbatim about what you do and who it is for.\n\n## Docs\n- [Quickstart](https://example.com/docs/quickstart): Get running in five minutes.\n- [API reference](https://example.com/docs/api): Every endpoint with examples.\n\n## Product\n- [Pricing](https://example.com/pricing): Plans, limits and exact prices.\n- [Changelog](https://example.com/changelog): What shipped, newest first.\n\n## Policies\n- [Terms](https://example.com/terms)\n- [Contact](https://example.com/contact): support@example.com"},"quickWin":true,"impact":4.7},{"id":"sitemap","pillar":"structure","title":"Publishes a sitemap","status":"fail","weight":8,"earned":0,"detail":"No sitemap found at https://qibbopress.com/sitemap_index.xml or in robots.txt.","why":"Without a sitemap, discovery depends entirely on crawlable links. Any page not reachable by a plain <a href> is invisible.","fix":{"summary":"Generate a sitemap.xml and reference it from robots.txt.","lang":"text","snippet":"Sitemap: https://example.com/sitemap.xml","where":"Append to /robots.txt"},"quickWin":true,"impact":4.1},{"id":"title","pillar":"comprehension","title":"Has a descriptive <title>","status":"fail","weight":10,"earned":0,"detail":"The page has no <title> element, or it is empty.","why":"The title is the label an assistant uses when it lists you among its sources. Without one you are cited as a bare URL, which almost nobody clicks.","fix":{"summary":"Add a unique title of roughly 40-65 characters that names the thing and the site.","lang":"html","snippet":"<title>Agent Experience Scanner - AXRAY</title>"},"quickWin":true,"impact":3.9},{"id":"content-volume","pillar":"comprehension","title":"Enough substance to be worth citing","status":"fail","weight":10,"earned":0,"detail":"Only 0 words of readable text reached the agent.","why":"There is not enough here for an assistant to build an answer from, so it will use someone else as the source.","fix":{"summary":"Make sure the real content is in the HTML, then make sure there is enough of it."},"impact":3.9},{"id":"server-rendered","pillar":"reachability","title":"Content exists without running JavaScript","status":"fail","weight":14,"earned":0,"detail":"The raw HTML contains 0 words of text.","why":"This is the single most expensive AX failure. To a crawling agent the page is blank, so it cannot be summarised, cited or ranked at all.","fix":{"summary":"Render the page content on the server, or pre-render it at build time.","where":"Any SSR/SSG mode, or a prerender middleware that serves static HTML to bot user-agents."},"impact":3.9},{"id":"h1","pillar":"comprehension","title":"Exactly one <h1> naming the page","status":"fail","weight":8,"earned":0,"detail":"The page has no headings at all.","why":"Without an h1 the agent has no anchor for the document topic and falls back to the title tag or the URL slug.","fix":{"summary":"Add a single <h1> at the top of the main content that states the page subject."},"quickWin":true,"impact":3.1},{"id":"meta-description","pillar":"comprehension","title":"Has a meta description","status":"fail","weight":8,"earned":0,"detail":"No <meta name=\"description\"> on the page.","why":"It is the one sentence you get to write yourself. Without it the assistant summarises you from whatever text it happened to read first, which is often your cookie banner.","fix":{"summary":"Add a 120-160 character description that states what the page offers, in plain language.","lang":"html","snippet":"<meta name=\"description\" content=\"Scan any URL and see exactly what an AI agent can read, understand and act on. Get an AX score and a prioritised fix list.\">"},"quickWin":true,"impact":3.1},{"id":"internal-nav","pillar":"actionability","title":"Links onward into the site","status":"fail","weight":6,"earned":0,"detail":"Only 0 internal links on the page.","why":"A page with no onward links is a cul-de-sac. Everything you publish that is not linked from a crawlable page effectively does not exist.","fix":{"summary":"Add a server-rendered navigation and contextual links to related pages."},"impact":3.1},{"id":"text-ratio","pillar":"comprehension","title":"Signal-to-markup ratio","status":"fail","weight":8,"earned":0,"detail":"0.0% of the payload is readable text.","why":"The document is almost entirely machinery. An agent truncating this page will likely truncate before reaching any of your content.","fix":{"summary":"Reduce inline script and serialized state; aim for at least 12% readable text."},"impact":3.1},{"id":"open-graph","pillar":"structure","title":"Open Graph card is complete","status":"fail","weight":6,"earned":0.6,"detail":"Missing: og:title, og:description, og:type, og:url, og:image.","why":"When a page is JavaScript-heavy or truncated, Open Graph tags are frequently the only clean summary an agent gets.","fix":{"summary":"Add the four core Open Graph tags plus an image.","lang":"html","snippet":"<meta property=\"og:title\" content=\"Page title\">\n<meta property=\"og:description\" content=\"One sentence.\">\n<meta property=\"og:type\" content=\"website\">\n<meta property=\"og:url\" content=\"https://example.com/page\">\n<meta property=\"og:image\" content=\"https://example.com/og.png\">"},"quickWin":true,"impact":2.8},{"id":"http-ok","pillar":"reachability","title":"Page responds to a plain HTTP request","status":"fail","weight":10,"earned":0,"detail":"The request failed: fetch failed","why":"Agents fetch with a short timeout and no retry budget. A request that fails once is a page that does not exist as far as they are concerned.","fix":{"summary":"Make sure the URL resolves over HTTPS within a few seconds from outside your network."},"impact":2.8},{"id":"api-discovery","pillar":"actionability","title":"Programmatic surface is discoverable","status":"warn","weight":6,"earned":0.9,"detail":"No well-known agent manifest, no OpenAPI reference and no developer docs link found.","why":"This is the frontier of AX: sites that publish a machine-callable surface get used by agents directly instead of being scraped approximately.","fix":{"summary":"Publish a minimal agent manifest describing what you offer and where to call it.","where":"/.well-known/mcp.json","lang":"json","snippet":"{\n  \"name\": \"Example\",\n  \"description\": \"What an agent can do with this service.\",\n  \"documentation\": \"https://example.com/docs\",\n  \"endpoints\": [\n    { \"type\": \"openapi\", \"url\": \"https://example.com/openapi.json\" }\n  ]\n}"},"quickWin":true,"impact":2.6},{"id":"contact-affordance","pillar":"actionability","title":"Reachable by a human, discoverably","status":"fail","weight":5,"earned":0,"detail":"No mailto, tel, contact link or contactPoint data found.","why":"\"How do I get in touch with them\" is one of the most common agent-mediated questions about a company. Make the answer machine-readable.","fix":{"summary":"Add a contactPoint to your Organization schema and link a real contact page.","lang":"json","snippet":"{\"@type\":\"Organization\",\"contactPoint\":[{\"@type\":\"ContactPoint\",\"contactType\":\"customer support\",\"email\":\"support@example.com\",\"url\":\"https://example.com/contact\"}]}"},"quickWin":true,"impact":2.6},{"id":"heading-hierarchy","pillar":"comprehension","title":"Headings form a sane outline","status":"fail","weight":6,"earned":0,"detail":"Only 0 headings on the page.","why":"Agents chunk long pages by heading. A page with no outline is chunked arbitrarily and quoted out of context.","fix":{"summary":"Break the content into sections with <h2> headings that read as answers to real questions."},"quickWin":true,"impact":2.3},{"id":"landmarks","pillar":"comprehension","title":"Main content is marked as such","status":"fail","weight":6,"earned":0,"detail":"No <main> element. Landmarks present: none.","why":"Without a main landmark an extractor has to guess your content boundary heuristically, and on marketing pages it usually guesses the header.","fix":{"summary":"Wrap the primary content in <main>, and each self-contained item in <article>.","lang":"html","snippet":"<main>\n  <article>\n    <h1>…</h1>\n    …\n  </article>\n</main>"},"quickWin":true,"impact":2.3},{"id":"lang","pillar":"comprehension","title":"Declares a document language","status":"fail","weight":5,"earned":0,"detail":"The <html> element has no lang attribute.","why":"Without it an assistant guesses the language, and guesses wrong on short or mixed-language pages, producing garbled quotes.","fix":{"summary":"Set the language on the root element.","lang":"html","snippet":"<html lang=\"en\">"},"quickWin":true,"impact":2},{"id":"mcp-manifest","pillar":"contract","title":"Exposes an agent-callable manifest","status":"fail","weight":6,"earned":0,"detail":"No /.well-known/mcp.json and no ai-plugin.json.","why":"This is the highest-leverage unclaimed slot on the web right now. The sites that publish a callable surface get used directly instead of guessed at.","fix":{"summary":"Publish a manifest naming what an agent can do with you and where to call it.","where":"/.well-known/mcp.json","lang":"json","snippet":"{\n  \"schema_version\": \"2025-06-18\",\n  \"name\": \"example\",\n  \"description\": \"Search the catalogue and check availability.\",\n  \"documentation\": \"https://example.com/docs\",\n  \"servers\": [\n    { \"type\": \"http\", \"url\": \"https://mcp.example.com\" }\n  ],\n  \"contact\": \"support@example.com\"\n}"},"impact":2},{"id":"freshness","pillar":"contract","title":"Says when the content changed","status":"warn","weight":5,"earned":0,"detail":"No Last-Modified, ETag, dateModified or <time> element anywhere.","why":"Agents deprioritise content they cannot date, and re-fetch undated pages more often, which costs you bandwidth for nothing.","fix":{"summary":"Send Last-Modified and ETag, and publish dateModified in your structured data.","lang":"json","snippet":"{\"@type\":\"Article\",\"datePublished\":\"2026-01-15\",\"dateModified\":\"2026-08-01\"}"},"quickWin":true,"impact":1.7},{"id":"identity","pillar":"contract","title":"Identity is machine-verifiable","status":"fail","weight":5,"earned":0,"detail":"No Organization structured data on the page.","why":"Entity resolution is how assistants decide two mentions are the same company. Unresolved entities get merged with, or mistaken for, someone else.","fix":{"summary":"Publish Organization data with sameAs links to your verified profiles.","lang":"json","snippet":"{\"@context\":\"https://schema.org\",\"@type\":\"Organization\",\"name\":\"Example Inc\",\"url\":\"https://example.com\",\"logo\":\"https://example.com/logo.png\",\"sameAs\":[\"https://x.com/example\",\"https://github.com/example\",\"https://www.linkedin.com/company/example\"]}"},"quickWin":true,"impact":1.7},{"id":"ai-policy","pillar":"contract","title":"States an explicit AI policy","status":"warn","weight":6,"earned":1.5,"detail":"robots.txt has no per-agent AI groups, and there is no TDM reservation or noai directive anywhere.","why":"With no explicit policy, every operator applies its own default to you and you have no documented position if you later object.","fix":{"summary":"Say what you want, per crawler. Allow the ones that send traffic; decide separately about the training ones.","where":"/robots.txt","lang":"text","snippet":"# Answer engines: allowed, they cite and link us.\nUser-agent: OAI-SearchBot\nUser-agent: PerplexityBot\nUser-agent: Claude-SearchBot\nUser-agent: DuckAssistBot\nAllow: /\n\n# User-triggered fetches: allowed, a person is waiting.\nUser-agent: ChatGPT-User\nUser-agent: Claude-User\nUser-agent: Perplexity-User\nAllow: /\n\n# Training crawlers: your call. This example allows them.\nUser-agent: GPTBot\nUser-agent: ClaudeBot\nUser-agent: Google-Extended\nAllow: /"},"quickWin":true,"impact":1.5},{"id":"canonical","pillar":"structure","title":"Declares a canonical URL","status":"warn","weight":6,"earned":3,"detail":"No <link rel=\"canonical\"> on the page.","why":"Agents dedupe sources by canonical URL. Without one, the same content behind different query strings competes with itself and dilutes every citation.","fix":{"summary":"Add a self-referencing canonical link to every page.","lang":"html","snippet":"<link rel=\"canonical\" href=\"https://qibbopress.com/\">"},"quickWin":true,"impact":1.5},{"id":"search-affordance","pillar":"actionability","title":"Site search is machine-usable","status":"warn","weight":4,"earned":1,"detail":"No crawlable GET search form and no SearchAction.","why":"Without a GET-addressable search, an agent looking for one specific page on your site has to fetch dozens of pages to find it, and usually gives up first.","fix":{"summary":"Expose search at a GET URL like /search?q=… and declare it as a SearchAction."},"quickWin":true,"impact":1.5},{"id":"licence-signal","pillar":"contract","title":"Declares content licensing","status":"warn","weight":5,"earned":1,"detail":"No rel=\"license\" link and no license or copyright fields in structured data.","why":"If you care how your content is reused, say so where machines can read it. A footer copyright line is not machine-readable.","fix":{"summary":"Declare the licence on the page and in your structured data.","lang":"html","snippet":"<link rel=\"license\" href=\"https://example.com/terms\">"},"quickWin":true,"impact":1.3},{"id":"security-txt","pillar":"contract","title":"Publishes security.txt","status":"warn","weight":4,"earned":0.8,"detail":"No /.well-known/security.txt.","why":"It is the standard machine-readable place to say who to contact. Agents and researchers both look there first.","fix":{"summary":"Add a security.txt with a contact address and an expiry date.","where":"/.well-known/security.txt","lang":"text","snippet":"Contact: mailto:security@example.com\nExpires: 2027-01-01T00:00:00.000Z\nPreferred-Languages: en"},"quickWin":true,"impact":1.1},{"id":"twitter-card","pillar":"structure","title":"Declares a link preview card","status":"warn","weight":3,"earned":1.5,"detail":"No twitter:* card tags.","why":"Several agents fall back to card metadata when they cannot extract the body reliably.","fix":{"summary":"Add a summary_large_image card.","lang":"html","snippet":"<meta name=\"twitter:card\" content=\"summary_large_image\">\n<meta name=\"twitter:title\" content=\"Page title\">\n<meta name=\"twitter:description\" content=\"One sentence.\">"},"quickWin":true,"impact":0.8},{"id":"robots-exists","pillar":"reachability","title":"robots.txt is present and parseable","status":"warn","weight":4,"earned":2,"detail":"No robots.txt served (HTTP 0).","why":"Without a robots.txt every crawler applies its own defaults and you have no way to express a preference. It is also the file most agents read first.","fix":{"summary":"Publish a robots.txt that allows answer engines and points at your sitemap.","lang":"text","snippet":"User-agent: *\nAllow: /\n\nSitemap: https://example.com/sitemap.xml","where":"/robots.txt"},"quickWin":true,"impact":0.6},{"id":"content-type","pillar":"reachability","title":"Declares a correct content type","status":"warn","weight":3,"earned":1.5,"detail":"No Content-Type header was returned.","why":"Agents use the header to decide whether to parse the body as HTML at all.","fix":{"summary":"Send `Content-Type: text/html; charset=utf-8`."},"quickWin":true,"impact":0.4}],"summary":"qibbopress.com scores 20/100 (F) for Agent Experience. This page is invisible to AI agents. Whatever an assistant says about you today, it is not reading it here. The score is capped at 20 for one reason: The page did not return a successful response to a plain HTTP request, so nothing else on this report can help until it does. The weakest pillar is Comprehension at 5/100. The three highest-value fixes are ships structured data (+6.2 pts), navigation uses real links (+6.2 pts), publishes an llms.txt (+4.7 pts).","error":"fetch failed"}