Based on 36 checks · 25 deterministic · 10 heuristic · 1 model-assisted.
Step 3 is the one step that is not universal, and this specification does not present it as though it were. The free scan behind /score/<domain> is HTTP-only: it opens no browser at all, and records that it did not. The Deep Scan runs the full engine, which opens a headless browser only when the fetched HTML looks JavaScript-dependent — little extractable text, or an empty mount node — and only when enough of the scan budget remains for a render to finish. That browser is either launched locally or connected to over CDP, depending on deployment; the rubric treats both identically.
Where the two modes differ is in what gets measured, never in how a measurement is scored. Checks that need a rendered DOM — performance.full_render_ms above all — return skip when no render happened, and a skip is excluded from its sub-score denominator under §3. A scan therefore reports fewer measured checks in HTTP-only mode; it never reports a rendered measurement it did not take.
The following constraints bind every model-assisted check and MUST hold in any future probe added to the rubric:
Each scan is persisted with the rubric version and grade-band version in force at the time it ran (Scan.rubricVersion, Scan.gradeBandVersion). Rendering a scan, including via its permalink at /score/<domain>/scan/<scanId>, uses those stored versions, not the current rubric. Changes to the rubric MUST NOT rescore or mutate historical scans. A deprecated check (deprecatedIn set) continues to display on historical scans that included it.
Existing ids are never renumbered to look tidier: they are already embedded in issued certificates, stored scans and public permalinks, and rewriting them would invalidate citations that are correct as published.
Every rubric version is immutable after publication. Each version's file has a content hash; that hash is part of the citation format in §13.
The rubric targets a minimum share of deterministic weight and maximum shares of heuristic and model-assisted weight, so a score cannot be dominated by AgentSpeed-chosen thresholds or by a language model:
versionstatuspublishedchangesfile sha
r2026.11.0active2026-08-19Adds actionability.commerce_protocols (weight 1, emerging): does the site declare an agentic-commerce discovery manifest — x402 (/.well-known/x402.json), UCP (/.well-known/ucp), or ACP (/.well-known/acp.json)? One check that passes on any of the three, because a site adopts one standard and the capability, not the spelling, is the subject. Nothing else changes: no thresholds move, no check is removed or reweighted. The text-density finding now reports where a document's bytes actually went. It gave a percentage and then blamed "heavy ad or navigation markup", which is wrong for most framework-rendered pages, where the weight is serialized hydration state inside script tags. Measured across 20 live sites, script and style are a median 34% of a homepage. Thresholds are unchanged: on the same 20 sites the existing bands separate document-first sites from application shells, with 30% passing. One page now yields one text reading. Three implementations of "the text an agent sees" had drifted apart over what to do with template elements, the document title and inline SVG labels, so the same page scored differently depending on which path scanned it. Verdicts move slightly downward on template-heavy pages scanned through the public path. performance.payload_kb can fail again. It fails above 3 MB, but the public scan refuses to download more than 3 MB, so the heaviest documents on the web were recorded as "not measured" and scored 100. A document too large to fetch is now graded as too large rather than as a missing measurement. A scan no longer describes a document the origin never served. When the landing page returns a non-2xx status, every check whose subject is that document reports no measurement; robots.txt, sitemap.xml and the /.well-known surface still report, because they are separate fetches, and reachability.status still fails, because the status code is its subject. Found in the corpus: the three highest text-ratio scores across 43 scans were a 404 and two 403s, at 90.0%, 77.6% and 40.2%, all PASS, while every site that served us a real page failed the same check. content.text_ratio requires a document of at least 2,048 bytes. Below that there is no markup weight to crowd out text, so the ratio measures rounding. Threshold set from the corpus, where every document under 16 KB passed and the smallest to return anything else was 33,794 bytes. A refused probe is no longer read as an absent resource. The /.well-known checks scored any unsuccessful probe as "not published", so a site blocking our user-agent was told to publish six files it may already serve. HTTP 401, 403, 407, 408, 429 and 5xx now report no measurement; 404, 410, a 200 with an invalid body, and 406 for Accept: text/markdown still fail, because each of those answers the question asked. New check family: operability (2 checks). Every check before this one graded what a page SAYS. None graded whether its controls can be worked by an agent driving the DOM, which is where agents actually fail. Published measurement, not assumption: on 300 tasks across 136 live sites the strongest agent succeeded 61.3% of the time, and filter and sorting errors caused 57.7% of its failures (arXiv:2504.01382); in a controlled experiment a call to action baked into an image was clicked 0/10 by every model tested versus 7/10 for the same action as a real element (arXiv:2507.12844). operability.primary_action_in_dom (actionability, weight 2, deterministic): a page that asks for an action must express it as a real clickable element. PASSes on the first link, button, or input carrying action language; SKIPs when the page asks for nothing; FAILs only when the words appear in image alt text or on a plain element and nothing clickable carries them. operability.filters_addressable (actionability, weight 2, deterministic): when a page offers to filter or sort a list, at least one filtered view must be reachable by URL, through a link with a query parameter or a GET form. WARNs when controls exist but produce no URL, FAILs when no operable control is served at all, SKIPs on pages with no facets. The check set grows from 34 to 36 (35 scored). No claim is made that operability changes citation or conversion rates. The cited research measures agent task success on other sites, not revenue on yours. These checks state something per-site and factual: the control is operable, or it is not. New check family: coherence (3 checks). The rubric so far verified each machine channel EXISTS - JSON-LD present, lang declared - but nothing verified the channels AGREE with each other or with what humans see. Disagreement is worse than absence: an absent price makes an agent hedge, a divergent one makes it quote the wrong number with confidence. Cross-channel agreement is also structurally un-gameable - the only way to game a consistency check is to become consistent. coherence.jsonld_price_matches_visible (structured_data, weight 2, deterministic): a price declared in JSON-LD must appear among the visible prices, compared by numeric value. FAILs only when ZERO declared prices are visible. Both price lists are recorded as evidence. coherence.jsonld_name_matches_visible (structured_data, weight 1, deterministic): a declared Product/Organization/Store name must appear in the title or visible text. coherence.language_declared_matches_content (readability, weight 1, heuristic): <html lang> compared against a conservative stopword/script language profile of the content; WARNs, never FAILs, and stays silent when unsure. The check set grows from 31 to 34 (33 scored). No claim is made that coherence affects AI citation rates - that measurement has not been done. What these checks demonstrate is per-site and factual: when the machine and human channels disagree, an agent trusting the machine channel quotes numbers and names the visible page does not show.sha fd2d068
r2026.10.4deprecated2026-07-30The text-density finding now reports where a document's bytes actually went. It gave a percentage and then blamed "heavy ad or navigation markup", which is wrong for most framework-rendered pages, where the weight is serialized hydration state inside script tags. Measured across 20 live sites, script and style are a median 34% of a homepage. Thresholds are unchanged: on the same 20 sites the existing bands separate document-first sites from application shells, with 30% passing. One page now yields one text reading. Three implementations of "the text an agent sees" had drifted apart over what to do with template elements, the document title and inline SVG labels, so the same page scored differently depending on which path scanned it. Verdicts move slightly downward on template-heavy pages scanned through the public path. performance.payload_kb can fail again. It fails above 3 MB, but the public scan refuses to download more than 3 MB, so the heaviest documents on the web were recorded as "not measured" and scored 100. A document too large to fetch is now graded as too large rather than as a missing measurement. A scan no longer describes a document the origin never served. When the landing page returns a non-2xx status, every check whose subject is that document reports no measurement; robots.txt, sitemap.xml and the /.well-known surface still report, because they are separate fetches, and reachability.status still fails, because the status code is its subject. Found in the corpus: the three highest text-ratio scores across 43 scans were a 404 and two 403s, at 90.0%, 77.6% and 40.2%, all PASS, while every site that served us a real page failed the same check. content.text_ratio requires a document of at least 2,048 bytes. Below that there is no markup weight to crowd out text, so the ratio measures rounding. Threshold set from the corpus, where every document under 16 KB passed and the smallest to return anything else was 33,794 bytes. A refused probe is no longer read as an absent resource. The /.well-known checks scored any unsuccessful probe as "not published", so a site blocking our user-agent was told to publish six files it may already serve. HTTP 401, 403, 407, 408, 429 and 5xx now report no measurement; 404, 410, a 200 with an invalid body, and 406 for Accept: text/markdown still fail, because each of those answers the question asked. New check family: operability (2 checks). Every check before this one graded what a page SAYS. None graded whether its controls can be worked by an agent driving the DOM, which is where agents actually fail. Published measurement, not assumption: on 300 tasks across 136 live sites the strongest agent succeeded 61.3% of the time, and filter and sorting errors caused 57.7% of its failures (arXiv:2504.01382); in a controlled experiment a call to action baked into an image was clicked 0/10 by every model tested versus 7/10 for the same action as a real element (arXiv:2507.12844). operability.primary_action_in_dom (actionability, weight 2, deterministic): a page that asks for an action must express it as a real clickable element. PASSes on the first link, button, or input carrying action language; SKIPs when the page asks for nothing; FAILs only when the words appear in image alt text or on a plain element and nothing clickable carries them. operability.filters_addressable (actionability, weight 2, deterministic): when a page offers to filter or sort a list, at least one filtered view must be reachable by URL, through a link with a query parameter or a GET form. WARNs when controls exist but produce no URL, FAILs when no operable control is served at all, SKIPs on pages with no facets. The check set grows from 34 to 36 (35 scored). No claim is made that operability changes citation or conversion rates. The cited research measures agent task success on other sites, not revenue on yours. These checks state something per-site and factual: the control is operable, or it is not. New check family: coherence (3 checks). The rubric so far verified each machine channel EXISTS - JSON-LD present, lang declared - but nothing verified the channels AGREE with each other or with what humans see. Disagreement is worse than absence: an absent price makes an agent hedge, a divergent one makes it quote the wrong number with confidence. Cross-channel agreement is also structurally un-gameable - the only way to game a consistency check is to become consistent. coherence.jsonld_price_matches_visible (structured_data, weight 2, deterministic): a price declared in JSON-LD must appear among the visible prices, compared by numeric value. FAILs only when ZERO declared prices are visible. Both price lists are recorded as evidence. coherence.jsonld_name_matches_visible (structured_data, weight 1, deterministic): a declared Product/Organization/Store name must appear in the title or visible text. coherence.language_declared_matches_content (readability, weight 1, heuristic): <html lang> compared against a conservative stopword/script language profile of the content; WARNs, never FAILs, and stays silent when unsure. The check set grows from 31 to 34 (33 scored). No claim is made that coherence affects AI citation rates - that measurement has not been done. What these checks demonstrate is per-site and factual: when the machine and human channels disagree, an agent trusting the machine channel quotes numbers and names the visible page does not show.sha 78f75e9
r2026.10.3deprecated2026-07-30A scan no longer describes a document the origin never served. When the landing page returns a non-2xx status, every check whose subject is that document reports no measurement; robots.txt, sitemap.xml and the /.well-known surface still report, because they are separate fetches, and reachability.status still fails, because the status code is its subject. Found in the corpus: the three highest text-ratio scores across 43 scans were a 404 and two 403s, at 90.0%, 77.6% and 40.2%, all PASS, while every site that served us a real page failed the same check. content.text_ratio requires a document of at least 2,048 bytes. Below that there is no markup weight to crowd out text, so the ratio measures rounding. Threshold set from the corpus, where every document under 16 KB passed and the smallest to return anything else was 33,794 bytes. A refused probe is no longer read as an absent resource. The /.well-known checks scored any unsuccessful probe as "not published", so a site blocking our user-agent was told to publish six files it may already serve. HTTP 401, 403, 407, 408, 429 and 5xx now report no measurement; 404, 410, a 200 with an invalid body, and 406 for Accept: text/markdown still fail, because each of those answers the question asked. New check family: operability (2 checks). Every check before this one graded what a page SAYS. None graded whether its controls can be worked by an agent driving the DOM, which is where agents actually fail. Published measurement, not assumption: on 300 tasks across 136 live sites the strongest agent succeeded 61.3% of the time, and filter and sorting errors caused 57.7% of its failures (arXiv:2504.01382); in a controlled experiment a call to action baked into an image was clicked 0/10 by every model tested versus 7/10 for the same action as a real element (arXiv:2507.12844). operability.primary_action_in_dom (actionability, weight 2, deterministic): a page that asks for an action must express it as a real clickable element. PASSes on the first link, button, or input carrying action language; SKIPs when the page asks for nothing; FAILs only when the words appear in image alt text or on a plain element and nothing clickable carries them. operability.filters_addressable (actionability, weight 2, deterministic): when a page offers to filter or sort a list, at least one filtered view must be reachable by URL, through a link with a query parameter or a GET form. WARNs when controls exist but produce no URL, FAILs when no operable control is served at all, SKIPs on pages with no facets. The check set grows from 34 to 36 (35 scored). No claim is made that operability changes citation or conversion rates. The cited research measures agent task success on other sites, not revenue on yours. These checks state something per-site and factual: the control is operable, or it is not. New check family: coherence (3 checks). The rubric so far verified each machine channel EXISTS - JSON-LD present, lang declared - but nothing verified the channels AGREE with each other or with what humans see. Disagreement is worse than absence: an absent price makes an agent hedge, a divergent one makes it quote the wrong number with confidence. Cross-channel agreement is also structurally un-gameable - the only way to game a consistency check is to become consistent. coherence.jsonld_price_matches_visible (structured_data, weight 2, deterministic): a price declared in JSON-LD must appear among the visible prices, compared by numeric value. FAILs only when ZERO declared prices are visible. Both price lists are recorded as evidence. coherence.jsonld_name_matches_visible (structured_data, weight 1, deterministic): a declared Product/Organization/Store name must appear in the title or visible text. coherence.language_declared_matches_content (readability, weight 1, heuristic): <html lang> compared against a conservative stopword/script language profile of the content; WARNs, never FAILs, and stays silent when unsure. The check set grows from 31 to 34 (33 scored). No claim is made that coherence affects AI citation rates - that measurement has not been done. What these checks demonstrate is per-site and factual: when the machine and human channels disagree, an agent trusting the machine channel quotes numbers and names the visible page does not show.sha 946257b
r2026.10.2deprecated2026-07-30New check family: operability (2 checks). Every check before this one graded what a page SAYS. None graded whether its controls can be worked by an agent driving the DOM, which is where agents actually fail. Published measurement, not assumption: on 300 tasks across 136 live sites the strongest agent succeeded 61.3% of the time, and filter and sorting errors caused 57.7% of its failures (arXiv:2504.01382); in a controlled experiment a call to action baked into an image was clicked 0/10 by every model tested versus 7/10 for the same action as a real element (arXiv:2507.12844). operability.primary_action_in_dom (actionability, weight 2, deterministic): a page that asks for an action must express it as a real clickable element. PASSes on the first link, button, or input carrying action language; SKIPs when the page asks for nothing; FAILs only when the words appear in image alt text or on a plain element and nothing clickable carries them. operability.filters_addressable (actionability, weight 2, deterministic): when a page offers to filter or sort a list, at least one filtered view must be reachable by URL, through a link with a query parameter or a GET form. WARNs when controls exist but produce no URL, FAILs when no operable control is served at all, SKIPs on pages with no facets. The check set grows from 34 to 36 (35 scored). No claim is made that operability changes citation or conversion rates. The cited research measures agent task success on other sites, not revenue on yours. These checks state something per-site and factual: the control is operable, or it is not. New check family: coherence (3 checks). The rubric so far verified each machine channel EXISTS - JSON-LD present, lang declared - but nothing verified the channels AGREE with each other or with what humans see. Disagreement is worse than absence: an absent price makes an agent hedge, a divergent one makes it quote the wrong number with confidence. Cross-channel agreement is also structurally un-gameable - the only way to game a consistency check is to become consistent. coherence.jsonld_price_matches_visible (structured_data, weight 2, deterministic): a price declared in JSON-LD must appear among the visible prices, compared by numeric value. FAILs only when ZERO declared prices are visible. Both price lists are recorded as evidence. coherence.jsonld_name_matches_visible (structured_data, weight 1, deterministic): a declared Product/Organization/Store name must appear in the title or visible text. coherence.language_declared_matches_content (readability, weight 1, heuristic): <html lang> compared against a conservative stopword/script language profile of the content; WARNs, never FAILs, and stays silent when unsure. The check set grows from 31 to 34 (33 scored). No claim is made that coherence affects AI citation rates - that measurement has not been done. What these checks demonstrate is per-site and factual: when the machine and human channels disagree, an agent trusting the machine channel quotes numbers and names the visible page does not show.sha a27e32e
r2026.10.1deprecated2026-07-30New check family: operability (2 checks). Every check before this one graded what a page SAYS. None graded whether its controls can be worked by an agent driving the DOM, which is where agents actually fail. Published measurement, not assumption: on 300 tasks across 136 live sites the strongest agent succeeded 61.3% of the time, and filter and sorting errors caused 57.7% of its failures (arXiv:2504.01382); in a controlled experiment a call to action baked into an image was clicked 0/10 by every model tested versus 7/10 for the same action as a real element (arXiv:2507.12844). operability.primary_action_in_dom (actionability, weight 2, deterministic): a page that asks for an action must express it as a real clickable element. PASSes on the first link, button, or input carrying action language; SKIPs when the page asks for nothing; FAILs only when the words appear in image alt text or on a plain element and nothing clickable carries them. operability.filters_addressable (actionability, weight 2, deterministic): when a page offers to filter or sort a list, at least one filtered view must be reachable by URL, through a link with a query parameter or a GET form. WARNs when controls exist but produce no URL, FAILs when no operable control is served at all, SKIPs on pages with no facets. The check set grows from 34 to 36 (35 scored). No claim is made that operability changes citation or conversion rates. The cited research measures agent task success on other sites, not revenue on yours. These checks state something per-site and factual: the control is operable, or it is not. New check family: coherence (3 checks). The rubric so far verified each machine channel EXISTS - JSON-LD present, lang declared - but nothing verified the channels AGREE with each other or with what humans see. Disagreement is worse than absence: an absent price makes an agent hedge, a divergent one makes it quote the wrong number with confidence. Cross-channel agreement is also structurally un-gameable - the only way to game a consistency check is to become consistent. coherence.jsonld_price_matches_visible (structured_data, weight 2, deterministic): a price declared in JSON-LD must appear among the visible prices, compared by numeric value. FAILs only when ZERO declared prices are visible. Both price lists are recorded as evidence. coherence.jsonld_name_matches_visible (structured_data, weight 1, deterministic): a declared Product/Organization/Store name must appear in the title or visible text. coherence.language_declared_matches_content (readability, weight 1, heuristic): <html lang> compared against a conservative stopword/script language profile of the content; WARNs, never FAILs, and stays silent when unsure. The check set grows from 31 to 34 (33 scored). No claim is made that coherence affects AI citation rates - that measurement has not been done. What these checks demonstrate is per-site and factual: when the machine and human channels disagree, an agent trusting the machine channel quotes numbers and names the visible page does not show.sha 0771b93
r2026.10.0deprecated2026-07-28New check family: operability (2 checks). Every check before this one graded what a page SAYS. None graded whether its controls can be worked by an agent driving the DOM, which is where agents actually fail. Published measurement, not assumption: on 300 tasks across 136 live sites the strongest agent succeeded 61.3% of the time, and filter and sorting errors caused 57.7% of its failures (arXiv:2504.01382); in a controlled experiment a call to action baked into an image was clicked 0/10 by every model tested versus 7/10 for the same action as a real element (arXiv:2507.12844). operability.primary_action_in_dom (actionability, weight 2, deterministic): a page that asks for an action must express it as a real clickable element. PASSes on the first link, button, or input carrying action language; SKIPs when the page asks for nothing; FAILs only when the words appear in image alt text or on a plain element and nothing clickable carries them. operability.filters_addressable (actionability, weight 2, deterministic): when a page offers to filter or sort a list, at least one filtered view must be reachable by URL, through a link with a query parameter or a GET form. WARNs when controls exist but produce no URL, FAILs when no operable control is served at all, SKIPs on pages with no facets. The check set grows from 34 to 36 (35 scored). No claim is made that operability changes citation or conversion rates. The cited research measures agent task success on other sites, not revenue on yours. These checks state something per-site and factual: the control is operable, or it is not. New check family: coherence (3 checks). The rubric so far verified each machine channel EXISTS - JSON-LD present, lang declared - but nothing verified the channels AGREE with each other or with what humans see. Disagreement is worse than absence: an absent price makes an agent hedge, a divergent one makes it quote the wrong number with confidence. Cross-channel agreement is also structurally un-gameable - the only way to game a consistency check is to become consistent. coherence.jsonld_price_matches_visible (structured_data, weight 2, deterministic): a price declared in JSON-LD must appear among the visible prices, compared by numeric value. FAILs only when ZERO declared prices are visible. Both price lists are recorded as evidence. coherence.jsonld_name_matches_visible (structured_data, weight 1, deterministic): a declared Product/Organization/Store name must appear in the title or visible text. coherence.language_declared_matches_content (readability, weight 1, heuristic): <html lang> compared against a conservative stopword/script language profile of the content; WARNs, never FAILs, and stays silent when unsure. The check set grows from 31 to 34 (33 scored). No claim is made that coherence affects AI citation rates - that measurement has not been done. What these checks demonstrate is per-site and factual: when the machine and human channels disagree, an agent trusting the machine channel quotes numbers and names the visible page does not show.sha 64ab233
r2026.09.0deprecated2026-07-27New check family: coherence (3 checks). The rubric so far verified each machine channel EXISTS - JSON-LD present, lang declared - but nothing verified the channels AGREE with each other or with what humans see. Disagreement is worse than absence: an absent price makes an agent hedge, a divergent one makes it quote the wrong number with confidence. Cross-channel agreement is also structurally un-gameable - the only way to game a consistency check is to become consistent. coherence.jsonld_price_matches_visible (structured_data, weight 2, deterministic): a price declared in JSON-LD must appear among the visible prices, compared by numeric value. FAILs only when ZERO declared prices are visible. Both price lists are recorded as evidence. coherence.jsonld_name_matches_visible (structured_data, weight 1, deterministic): a declared Product/Organization/Store name must appear in the title or visible text. coherence.language_declared_matches_content (readability, weight 1, heuristic): <html lang> compared against a conservative stopword/script language profile of the content; WARNs, never FAILs, and stays silent when unsure. The check set grows from 31 to 34 (33 scored). No claim is made that coherence affects AI citation rates - that measurement has not been done. What these checks demonstrate is per-site and factual: when the machine and human channels disagree, an agent trusting the machine channel quotes numbers and names the visible page does not show.sha caf8fc1
r2026.08.1deprecated2026-07-26New check markup.language (readability, weight 1, page-scoped): <html lang> must be present and a well-formed BCP 47 tag, and hreflang alternates must carry well-formed values when declared. The first language check in the rubric — an agent should not have to guess what language a document is in. The check set grows from 30 to 31. structured_data.type_coverage now recognises storefronts pricing in ¥ ₩ ₹ ₽ R$ and the major non-Western currency codes, with cart vocabulary in Japanese, Korean, Chinese, German, French, Spanish and Russian. Previously only $ € £ storefronts were evaluated; everyone else was "intent unclear" and passed by default. Sites affected lose a free pass, not points they had earned.sha 1710b08
r2026.08.0deprecated2026-07-26llms_txt.present is retired: still reported, no longer scored, and labelled unproven. Google states Search does not use llms.txt; a ~300,000-domain study found no correlation with AI citations and improved accuracy when the variable was removed; a 137,210-domain crawl found 97% of these files received zero requests in May 2026. Most requests they do receive come from SEO audit tools checking the file exists. It remains reported so a site can see its status, but ~4.5% of every score should not have rested on it. Sites without llms.txt score HIGHER under this version. performance.ttfb_ms drops from weight 2 to 1. The deployed scan path records total fetch time and labels it TTFB, and takes one sample from one location — a self-declared proxy should not carry the same weight as paywall or JS-dependency detection. This also keeps the rubric inside the §11.1 heuristic ceiling after llms_txt.present went to zero. robots_txt.allows_known_agents now scores Applebot, the crawler behind Siri and Spotlight answers. Only Applebot-Extended (the AI-training opt-out) was tracked before, so blocking the agent that decides whether Siri can recommend you cost nothing. The scored set goes from 8 access agents to 9, and sites blocking Applebot score lower under this version. Baiduspider, Sogou, PetalBot, YandexBot and Naver Yeti are recognised for the first time and reported when blocked, together with the markets a site declares via <html lang> and hreflang. They are NOT scored: blocking Baidu is a defect for a site selling into China and a reasonable choice for one that is not, and the two must not be charged the same. Every previously scored access agent was US-operated, so the score could not express "invisible to Chinese, Russian or Korean AI" at all. Weights, grade bands and the check set are unchanged.sha 8c8f95b
r2026.07.4deprecated2026-07-25structured_data.validates no longer penalises a JSON-LD block whose @type is outside the twenty types this validator implements. Such blocks were reported as warnings worth −5 each, so a page using SoftwareApplication, Course, JobPosting, or Book was docked for our coverage gap rather than for a defect in its markup. They are now informational and excluded from scoring. Weights, grade bands, and the check set are unchanged. structured_data.validates no longer reports a missing @context for nodes inside a @graph. @context is a document-level JSON-LD keyword that scopes the entire document, so graph nodes correctly omit it; the validator was flagging every node of the canonical multi-entity pattern. Sites using @graph score higher under this version. Weights, grade bands, and the check set are unchanged. robots_txt.allows_known_agents now scores only answer-time access agents (assistant fetchers and AI search indexers). Training-data crawler blocks (GPTBot, CCBot, Google-Extended, Bytespider, …) are reported as informational instead of failing the check — blocking AI training is a content-licensing choice, not an agent-readiness defect. Deprecated Claude-Web replaced with the documented Claude-User and Claude-SearchBot agents. Weights unchanged.sha ed23d54
r2026.07.3deprecated2026-07-25structured_data.validates no longer reports a missing @context for nodes inside a @graph. @context is a document-level JSON-LD keyword that scopes the entire document, so graph nodes correctly omit it; the validator was flagging every node of the canonical multi-entity pattern. Sites using @graph score higher under this version. Weights, grade bands, and the check set are unchanged. robots_txt.allows_known_agents now scores only answer-time access agents (assistant fetchers and AI search indexers). Training-data crawler blocks (GPTBot, CCBot, Google-Extended, Bytespider, …) are reported as informational instead of failing the check — blocking AI training is a content-licensing choice, not an agent-readiness defect. Deprecated Claude-Web replaced with the documented Claude-User and Claude-SearchBot agents. Weights unchanged.sha 3c6337b
r2026.07.2deprecated2026-07-23robots_txt.allows_known_agents now scores only answer-time access agents (assistant fetchers and AI search indexers). Training-data crawler blocks (GPTBot, CCBot, Google-Extended, Bytespider, …) are reported as informational instead of failing the check — blocking AI training is a content-licensing choice, not an agent-readiness defect. Deprecated Claude-Web replaced with the documented Claude-User and Claude-SearchBot agents. Weights unchanged.sha 07da708
r2026.07.1deprecated2026-07-20Rebalance weights after the first months of production scans: the five weight-2 emerging-standard checks (Content-Signal, MCP server card, markdown negotiation, Agent Skills, WebMCP) drop to weight 1; five established fundamentals (llms.txt, sitemap, canonical URL, title, meta description) rise to weight 2. Class shares are unchanged. Tag the nine agent-protocol checks introduced in r2026.04.2 as maturity: emerging so score surfaces label them as early-adoption opportunities rather than defects.sha adca6e8
r2026.04.2deprecated2026-04-27Rebalance per-check weights so the rubric satisfies the §11.1 class policy (deterministic ≥60%, heuristic ≤30%, ≤2 per LLM-assisted check). Add 10 checks aligned with 2026 agent-protocol standards: MCP server card, OAuth authorization-server + protected-resource discovery, API catalog, Web Bot Auth, Content-Signal directives, markdown content negotiation, Agent Skills manifest, WebMCP, HTTP Link headers.sha 7045eb0
r2026.04.1deprecated2026-04-01Initial rubric: 20 checks across 5 sub-scores.sha 2794c2b
A citation names the domain, the rubric version, the scan ID, and the scan timestamp: