Every change to the instrument
When a score moves, it is either your site that changed or our instrument. This is the record of the second, so you can tell them apart. The prose under each version is what its authors wrote; the change list below it is derived from the rubric files, so it cannot describe an edit that did not happen or miss one that did.
Versions are immutable (§10): a scan renders against the rubric it was computed under, and none of this rescores anything. The full current spec is at /rubric, every version as data at /rubric.json.
r2026.11.0
active2026-08-19 · sha fd2d068 · from r2026.10.4- Adds 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.
r2026.10.4
2026-07-30 · sha 78f75e9 · from r2026.10.3- 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.
r2026.10.3
2026-07-30 · sha 946257b · from r2026.10.2- 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.
r2026.10.2
2026-07-30 · sha a27e32e · from r2026.10.1No change to the instrument. Every check, weight, threshold and grade band in this version is identical to r2026.10.1. The content hash differs only because the publication date and changelog text do — this version number was taken by a release that did not alter the rubric, and a score computed under either version means exactly the same thing.
r2026.10.1
2026-07-30 · sha 0771b93 · from r2026.10.0No change to the instrument. Every check, weight, threshold and grade band in this version is identical to r2026.10.0. The content hash differs only because the publication date and changelog text do — this version number was taken by a release that did not alter the rubric, and a score computed under either version means exactly the same thing.
r2026.10.0
2026-07-28 · sha 64ab233 · from r2026.09.0- 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.
r2026.09.0
2026-07-27 · sha caf8fc1 · from r2026.08.1- 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.
r2026.08.1
2026-07-26 · sha 1710b08 · from r2026.08.0- New 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.
r2026.08.0
2026-07-26 · sha 8c8f95b · from r2026.07.4- llms_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.
r2026.07.4
2026-07-25 · sha ed23d54 · from r2026.07.3- structured_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.
No change to the instrument. Every check, weight, threshold and grade band in this version is identical to r2026.07.3. The content hash differs only because the publication date and changelog text do — this version number was taken by a release that did not alter the rubric, and a score computed under either version means exactly the same thing.
r2026.07.3
2026-07-25 · sha 3c6337b · from r2026.07.2- 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.
No change to the instrument. Every check, weight, threshold and grade band in this version is identical to r2026.07.2. The content hash differs only because the publication date and changelog text do — this version number was taken by a release that did not alter the rubric, and a score computed under either version means exactly the same thing.
r2026.07.2
2026-07-23 · sha 07da708 · from r2026.07.1- 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.
r2026.07.1
2026-07-20 · sha adca6e8 · from r2026.04.2- Rebalance 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.
r2026.04.2
2026-04-27 · sha 7045eb0 · from r2026.04.1- Rebalance 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.
r2026.04.1
2026-04-01 · sha 2794c2b · first version- Initial rubric: 20 checks across 5 sub-scores.
Weight changes are governed by the evidence rules: no weight moves on the strength of the calibration corpus alone, because a detector being correct is not evidence that what it detects affects an agent.