If your score moves, this page is how you tell whether your site changed or the rubric did.
Entries marked Specification are the ones that change what a number means.
How do I tell whether my score moved or the rubric did?
By the label on the entry. An entry marked Specification changes what a number
means: a check added, a weight moved, a rule sharpened. If your score changed on a day one of
those shipped and you changed nothing, that entry is the reason, and it says which direction
scores move and on which kind of page. An entry marked Product changes the
site, the report or the tooling and leaves every score exactly where it was.
What does the version number promise?
That scores are comparable within a major version and that nothing moves silently. Every report
records the specification version it was produced against, so a score from a month ago can
always be read against the rubric it was actually measured with. The rubric itself is
published in full and generated from the scoring code, which is what
stops the document and the scanner drifting apart between releases.
Every change, newest first
· Product
The site is dark unless you ask for light
Until today the theme followed the operating system, so a visitor on a machine set to light met a white site. That is a defensible default for a document and the wrong one here: this is an instrument, every screenshot of it is dark, and the score rings were drawn to glow on a dark panel. Most people never saw the product as it was designed.
Dark is now the theme. Light is still a complete, contrast-checked theme rather than an afterthought — there is a switch in the header, and the choice is remembered in your own browser and never sent anywhere.
The switch is applied in the page head, before anything is drawn, so choosing light does not mean watching the dark page flash first. That is the second and last inline script on this site, and like the first it is allowed by the hash of its own bytes rather than by loosening the content-security policy.
· Product
The five pillars now say what they weigh and what they cost
The pillar row at the top of every report was five names, five thin bars and five numbers. It told you that Structure scored 19 and left out both of the things you would need in order to do anything about it: that Structure is 18% of the score, and that the 19 is costing you 14.6 points off the number in the dial beside it.
Each pillar is now a gauge with its weight underneath it and its price in points below that, coloured on the same thresholds as everything else on the site. An identical-looking 60 on Reachability and on Agent Contract are not the same problem, and the report now says so before anybody has to open the rubric to find out why.
The arithmetic is the one already used to price individual findings — the pillar’s lost fraction, times its share of the weight that was actually in play — so a pillar that had no applicable questions is drawn empty and labelled as not asked, rather than shown as a zero or as a hundred. Add the five costs up and you get the gap between the score and 100 back, give or take the rounding on each.
The downloadable PDF carries the same two lines under each bar, because the person who receives the file is usually not the person who ran the scan.
· Specification
AX specification v1.5.7: what a newspaper front page taught the retrieval check
The retrieval reading shipped this morning and every test we had for it was written against this site, which is a documentation site written by the people who wrote the check. So it was run against eleven European news home pages instead, and it was wrong about most of them. Three separate ways, all fixed here.
A header inside an article is that article’s header, not the site banner. HTML gives a header the banner role only when it is outside sectioning content, and `<article><header><h2>The headline</h2></header>` is the recommended way to mark up an article card. Removing headers at every depth — which we started doing this morning, to strip a breadcrumb — threw away the headline of every one of those cards. One front page came back with fifty-four unlabelled passages and a retrieval score of 7%, which was entirely our doing. Navigation and aside blocks are still removed wherever they sit; a breadcrumb inside an article is still a breadcrumb.
A passage is measured with its heading, because that is what a chunker carries into it. A card whose heading is the whole headline and whose body is a byline is a perfectly quotable passage, and measuring the body alone reported a hundred and sixty-four of one paper’s article cards as fragments.
Alt text is content, and a news teaser does not have to end in a full stop. The rule that caught stub passages asked for a terminating full stop and threw away image alt text — but a teaser is a complete sentence that conventionally ends without punctuation, and on a news home page the alt text is frequently where the headline lives. It now asks whether the passage carries words of its own, which is the question it was always trying to ask.
Two other checks stopped guessing. `table-semantics` used to warn that a page might be showing a comparison in a grid of divs, on the evidence of four elements with a class like `row` — which is the Bootstrap layout primitive, so it fired on gov.uk, Der Spiegel, Gazeta and Mercado Livre, none of which was showing a comparison at all. A page with no table is now simply not asked the question. And `status-honesty` no longer reports an empty body on a page that assembles itself in the browser, because `server-rendered` already fails that and the score is already capped for it; taking the points twice for one fault reads as a report padding its findings.
The pattern in all five is the same, and it is the one this project treats as the most expensive mistake available: a check that fires on a page which is doing nothing wrong. On a page marked up the recommended way, scores go up.
· Specification
AX specification v1.5.0: a type that does not exist is not a type
Until today the scanner could tell whether your page declared a structured-data type, and whether that type was one of the two dozen we consider high-value. It could not tell whether the type existed. So a page declaring `"@type": "Prodcut"` — a typo, or an invented name, or a real name in the wrong case — passed every check we had. It parses. It carries the right context. It looks completely fine in a browser. And it is discarded outright by every consumer that resolves the vocabulary, which means the block bought the page nothing at all while costing somebody the afternoon they spent adding it.
The check now knows the vocabulary. Around 900 class names and 1,400 property names from the published schema.org release are compiled into the scanner — names only, not the definitions, because the only question being asked is whether a name is real.
An unknown type fails the check and an unknown property only warns, and the difference is not arbitrary: a consumer keys the whole node on its type, so a wrong type discards everything underneath it, while a wrong property loses one field from a node that still resolves.
What it deliberately does not judge: anything that belongs to another vocabulary. A type given as a full URL, or a prefixed term like `dc:creator`, is somebody else’s business. A page mixing in Dublin Core is not making a mistake, and a checker that says otherwise is wrong about a page that is right.
Scores move downward on pages whose structured data was already resolving to nothing, and nowhere else.
· Specification
AX specification v1.4.2: the retrieval check now reads ten languages
The check that cuts a page into the passages an assistant is actually handed has two halves. The structural half — does this passage have a heading, is it a link list, is it long enough to be an answer — works on any page in any language. The half that reads words does not, and until now it was implemented for four languages: English, Turkish, Russian and Arabic. On a page in any other language it was simply not applied, which is the honest thing to do and also means most of the web was getting half a check.
It now covers German, French, Spanish, Portuguese, Italian and Dutch as well. Scores move downward on pages in those six languages that were already writing passages an assistant cannot use, and nowhere else.
Each word list is deliberately shorter than it could be, and the omissions are the interesting part. German `das` is missing because it is the definite article at least as often as it is a demonstrative, and `Sie` because capitalised it is the formal “you”, so “Sie erhalten den Bericht…” is an ordinary and correct way to open a section. Dutch `het` and `dat` are missing for the same kind of reason. French `il` is missing because `il y a` and `il est possible` are impersonal constructions and among the commonest ways a French paragraph legitimately begins. Spanish and Portuguese drop the subject pronoun entirely, so the clearest case of all — “Cuesta 29 €” — cannot be caught without part-of-speech tagging, and is not guessed at.
The principle behind every one of those omissions: a missed orphan costs nothing, and a false one costs the reader’s trust in every other finding on the report.
· Specification
AX specification v1.4.1: two ways the scanner was misreading a page
Both were found the same way: by writing an article about the retrieval check that shipped this morning, publishing it here, and then scanning it. Both are the same kind of mistake, and it is the kind this project treats as the worst kind — a check that fires on writing that is doing nothing wrong. A finding somebody disagrees with is a finding they learn to skip, and then they skip the one that mattered.
The first: a phrase in quotation marks is being mentioned, not used. The rule that catches a passage pointing at another part of the page — “as the table above shows”, “see the previous section” — fired on an article that quoted those phrases in order to explain why they break. That is the same failure the bot-wall detector had before v1.2.0, when a page about bot protection was reported as being behind one. Quoted spans are now removed before that rule runs.
The second: a navigation block is navigation wherever it sits. The scanner subtracted the site furniture — nav, header, footer, aside — only from pages that did not mark a main content region. On a page that does mark one, a breadcrumb or a contents list inside it counted as the page’s own words. On this site that meant the first retrieval passage of every article was the three words of its breadcrumb. Furniture is now removed at any depth inside the content region too, which is what every extractor of this kind already does.
No check was added or removed and no weight moved. Two checks move in both directions: a page carrying navigation inside its content loses words it should never have been credited with, and a page that writes about writing stops being marked down for quoting the thing it is warning about.
· Specification
AX specification v1.4.0: what happens to your page after the agent has it
Everything the rubric measured until now was about getting the page into the agent’s hands: can it be fetched, is the content there, is the metadata right. This release measures the step after that, which is where most well-written pages quietly lose. No assistant reads your page. It reads a passage of a few hundred tokens that a retrieval system pulled out of an index, and it writes its answer from that passage alone. The new check called passage independence runs that cut the way a real retrieval pipeline does — split at the headings, carry the heading into each piece, cap each piece at about three hundred tokens — and then asks of every piece whether somebody who saw only that piece would know what it was about. A section that opens "It costs €29 a month" is unusable on its own, and a long page with no headings has nothing to be cut on, so every piece after the first arrives with no label at all.
The second new idea is fact consistency: your structured data read against your visible text, and every place the two disagree reported as a finding. A price in the JSON-LD that is not one of the prices printed on the page. A product marked in stock on a page that says sold out. A dateModified stamped a year into the future. A name that exists only in the graph because a template was copied and never finished. None of this shows in a browser, none of it breaks a test, and all of it gets quoted with confidence, because an assistant has no reason to doubt the half of the page it can simply believe. This is the one check where publishing structured data can cost you points, and that is deliberate: confidently wrong is worse for a reader than absent.
Four checks about how the response actually arrived. Whether the HTML was compressed, which is free and which a surprising number of origins forget. Whether an ETag or Last-Modified was sent, so a crawler can ask "has this changed?" instead of downloading the page again — the sites complaining loudest about AI crawler traffic are, overwhelmingly, sites that send neither. Whether a 200 response is a page that says it is missing, which is the soft 404 and is how an error message ends up indexed under a real URL. And whether the text arrived intact: mojibake, the corruption that turns ö into ö, is invisible to anybody reading in English and endemic everywhere else, and an assistant quoting you reproduces it exactly.
Three more about what can be lifted out: whether a comparison is a real table with header cells rather than a grid of divs, whether dates are machine-readable, and whether the page declares what an agent can actually do here with schema.org potentialAction. Two about what you have said: content-usage reads the IETF AI-preferences vocabulary from a header or robots.txt, which is the first standards-track way to say what may be done with your bytes rather than merely who may fetch them, and the licence check now also recognises an RSL licence.
The crawler roster grew from 16 to 53, with three categories that did not exist before. Autonomous agents — the ones that browse, compare and buy on a customer’s behalf — because blocking one does not make you look worse than a competitor, it removes you from the comparison before anybody sees it. Retrieval providers, the handful of companies that crawl once and sell the index everybody else’s AI product searches, because blocking one of those takes you out of every application built on it at the same moment and not one of them will ever appear in your logs. And coding agents, which read your documentation while a developer builds against you; that verdict is asked only of pages a coding agent would plausibly fetch, because a bakery that blocks Cursor has lost nothing. Tokens are cross-checked against the community register at ai.robots.txt; what each block costs you is our own judgement, written one crawler at a time.
Thirteen checks added, so the rubric now has 70. Scores are not comparable with v1.3.0 and they move in both directions. Our own site was the first thing it caught.
· Specification
AX specification v1.3.0: an article that mentions a price is not a shop
The check that asks whether your prices are machine-readable fired on any page containing a price-like string, and a page containing a price is not the same thing as a page selling something. Editorial pages quote prices constantly — a review naming what a thing costs, a news story about a funding round, a guide using "from €40,000" as an example of a concrete sentence — and every one of them was told its price was not readable by a machine, on a page with nothing for sale.
Where the page has declared itself an Article, NewsArticle, BlogPosting, TechArticle, ScholarlyArticle or Report, the check is now not-applicable rather than failed. The page has answered a different question from the one the check asks, and the six points leave the denominator rather than being lost.
The reason this is a fix and not merely a relaxation: the advice it used to give was advice nobody should take. Publishing Offer data on an article means publishing structured data describing a sale that is not on offer, which is worse for the reader an assistant is quoting to than the warning it silences.
This is a new version because it moves scores, and it moves them in one direction only: upward, on editorial pages that were being marked down for quoting a number. Nothing was added or removed and no weight changed; the count stands at 57. Our own writing was where it was found: an article on llms.txt went from 98 to 100.
Re-measured across the whole baseline afterwards, the median came back at 68 and the mean at 60 — the same pair the previous version produced. That is the result a fix this narrow should give, because it reaches only pages that are both an article and priced, and a corpus of homepages is almost none of those. Worth stating plainly rather than presenting as a controlled comparison: the two runs are days apart and a handful of sites time out differently each time, so the sample is 292 rather than 293. The medians agreeing is evidence the change is narrow, not proof that nothing moved.
· Product
The scanner stopped penalising the non-Latin web
Two bugs of the same family, both found by translating this site into Turkish, Russian and Arabic and scanning the result. Neither was visible from an English page, and together they meant the scanner was quietly worse at most of the world’s web.
Placeholder detection carried a pattern meaning "nothing but punctuation", written as a regular expression that — without a Unicode flag — treats every non-Latin script as punctuation. Arabic, Russian, Greek, Hebrew, Chinese, Japanese, Korean, Thai and Hindi headings were all reported as placeholder text. A site was being told its real content was filler, confidently and in the one direction that makes an owner distrust the whole report.
The rubric also rewards headings shaped like the question a reader typed, and it recognised that shape by the ASCII question mark alone. Arabic ends a question with ؟, Chinese, Japanese and Korean with the full-width ?, Armenian with ՞. A page whose every heading was a question was told it had none — a penalty for writing the language correctly. Greek is deliberately still excluded: its official question mark is U+037E, but real Greek text uses the ordinary semicolon, and accepting that would call every heading ending in one a question.
Recorded as fixes rather than a specification change, because the rubric asks exactly what it asked before. A page whose headings were real was being scored as though they were not. Scores move upward, and only on pages that were misread. Tested across ten scripts.
· Product
A page about bot walls is no longer mistaken for one
The check that asks whether a protection layer answered instead of your site looks for the phrases a challenge screen contains — "just a moment", "checking your browser", "you have been blocked". It found them in prose. Any page that writes about bot protection quotes those strings, so a security blog, a WAF vendor’s own documentation, or an article explaining how to test for a challenge screen was reported as being behind the wall it was describing.
The old guard was the size of the response: a signature counted if the page was under 60 kB, on the reasoning that a challenge page is small. An ordinary article sits comfortably under 60 kB too, so length never separated the two cases. What separates them is content — a challenge page is a holding page with a line of text and a script, and the article that tripped this had twelve hundred words. A signature now only counts when the page has almost no readable prose behind it.
The status-code rules are untouched: a 403, a 429, a Cloudflare 503 or a cf-mitigated header is still a wall no matter how much text comes with it. Only the ambiguous case — an HTTP 200 whose body mentions a challenge — now asks whether there is an article there.
This is a fix rather than a specification change, and the distinction matters for the comparability promise: the rubric still asks exactly what it asked before, at the same weight. A page that was never behind a bot wall was being told it was. Scores can move on this, but only upward and only on pages that were misread. Found by scanning our own writing, where an article about this exact subject scored 30 out of 100.
· Product
Somewhere to read, and a reference for the crawlers
A site that grades other people on whether an assistant can read their pages now has pages worth reading. Nine pieces at /writing, in English and Turkish, each rendered server-side into semantic HTML: one request, no JavaScript, Article structured data built from the same fields the page renders, and a real feed. Every statistic in them is read from the study rather than typed in, so re-running the measurement updates the prose rather than leaving it to go stale quietly.
The Turkish writing has its own index at /yazilar rather than sharing the English one. That is our own language check being taken seriously: a page declaring English while a measurable share of its letters occur almost only in Turkish gets quoted badly, and a Turkish reader arriving from a Turkish search should land somewhere written to them.
A reference at /ai-crawlers lists every AI crawler this scanner probes with — what each is for, the exact robots.txt token, what blocking it costs, and how many sites in the measured sample already block it. It is generated from the roster the product uses, so it cannot drift from the scanner, and the recommended robots.txt is generated too: no crawler that sends you traffic can appear in the disallowed group without a test failing.
IndexNow is now wired up, which tells Bing, Yandex, Seznam and Naver that a page changed instead of waiting to be crawled. Bing matters here beyond its own traffic, because several assistants answer questions by searching it.
· Specification
AX specification v1.2.0: a page no longer loses points for being precise
The structured-data check that asks whether a page declares a meaningful type kept a list of the types worth declaring, and Article was on it while TechArticle was not. Schema.org treats TechArticle as a kind of Article — it is the more precise answer, and the one a documentation page ought to give — but the check compared type names literally, so a page that named the exact type was scored as though it had declared nothing about itself, and a page that gave the vaguer answer scored better. Every documentation site doing it correctly was penalised for it, our own specification page among them. TechArticle, APIReference, ScholarlyArticle and Report now count.
Each of the four is held to the same properties an Article is: a headline, a publication date and a named author. Adding the types without that would have turned the fix into a free point — declare TechArticle on anything and collect eight — and the rubric has said since the version before this one that the type is the promise and the properties are the thing promised.
This is a new version because it moves scores, not because it adds anything. No check was added or removed and no weight changed; the count stands at 57. A score can only move upward on this change, and only on a page that was already doing the right thing.
Re-measured across the whole baseline of 294 public sites, the median stayed at 68 and the mean at 60 — and that is the result a fix this narrow should produce. It reaches four schema.org types on the pages that declare them, so almost nothing in a general population of sites moves at all; what moves is the documentation and research pages that were being marked down for precision. Our own specification page went from 97 to 98 on it.
· Specification
AX specification v1.1.0: the rubric now asks whether a page can be quoted
Everything before this measured whether an agent could reach a page and read it. That is necessary and it is not sufficient. An assistant answering a question looks for text shaped like the answer to it, and a page organised as "Features", "Benefits", "Overview" contains the answer and hides it behind labels nobody searches for. The new answerable check asks whether your headings are the questions your customers actually ask — and a pass needs enough text under each one to be an answer, not a label with a question mark on the end.
Three checks joined it. Metadata consistency compares the labels a page writes for machines — the title, the Open Graph and Twitter titles, and both descriptions — because when they disagree it is the stale one that gets quoted somewhere the owner never looks. Feed discovery scores a real feed where a page has one; linking to a stream is not being one, so a nav item is not enough. Language alternates catches an undeclared translation, which otherwise reads as a duplicate: a Turkish reader is quoted the English page while the version written for them never surfaces.
Three existing checks were sharpened. The lang check used to ask only whether the attribute was there, while the note beside it said a wrong value is worse than none; it now checks that the value parses and that the writing system the page is actually in matches the language it declares. Heading hierarchy now says when a well-formed outline is too coarse to chunk. And an Article must name an author, because an assistant repeating a claim wants to say who made it.
Scores are not comparable with v1.0.0, which is why this is a new version rather than a quiet edit. Re-measured across the whole baseline of 294 public sites, the median moved from 67 to 68 and the mean stayed at 60 — the new questions cost some pages points and the sharpened ones handed a few back. Every report records the spec version it was produced against, so an older number stays readable as an older number.
· Product
Four ways to take this service down, closed
A request whose Host header was not a valid hostname ended the server process. The line that builds the request URL sat outside the handler that catches errors, so the failure became an unhandled promise rejection, and Node answers those by terminating. One request, no account, no body — and repeated in a loop, an outage for as long as somebody cared to keep sending it. A malformed Host or request target is now a 400, which is what the HTTP specification asks for, and the process keeps serving.
Reading a page with deeply nested markup blocked the server for minutes. Several of the parser’s tag-closing rules scan the stack of open elements from the top, and nothing bounded that stack, so the work grew with the square of the nesting depth: 195 kB of nested divs took 2.3 seconds and the 3 MB we are willing to read would have taken far longer. Separately, anything past about ten thousand levels deep overflowed the call stack out of every check that reads text. The tree is now capped at 512 levels, which is what Firefox does; the same 195 kB now parses in 52 ms and no real document comes near the limit.
Three more places could end the process the same way the Host header did — two background crawls and the request path itself — because a rejected promise with nothing listening is fatal by default. Each has its own handler now, and the process has a last-resort one that logs and keeps serving rather than dropping every open connection over one failure.
The queue in front of the scanner had no limit on how long it could grow or how long anybody could sit in it, so a burst of arrivals held connections open for minutes. It now refuses politely once it is genuinely saturated, which is a better answer than a four-minute wait for the same news.
· Policy
A sign-in link can no longer send you somewhere else
The address to return to after signing in was taken from the URL and used without checking it, so a link to the real login form here could deposit a visitor on somebody else’s page the instant they authenticated — with our address bar right up to that moment. That is the shape of a credential-phishing chain, and this site’s own login page was the part that made it convincing. Only a path on this site is accepted now.
A private report requested as JSON was sent with a header telling every cache in between that it could keep the response and hand it to whoever asked next. The HTML version of the same report had always marked itself private; its JSON twin had not.
A subscription change made in the billing portal could downgrade the customer who made it. Stripe’s event carries the plan from when the subscription was created and never updates it, so an upgrade to Team arrived describing itself as Pro, and we believed it. The plan is now read from the price actually being billed. Repeated deliveries of the same event — which Stripe sends as a matter of course, and which a signature check cannot distinguish from the original — are now applied once.
These were found by reviewing the code rather than by anybody exploiting them, and there is no evidence any of them was used. They are written down here because a security fix nobody publishes is indistinguishable from one nobody made.
· Product
The site has a typeface, a scan line and an agent
Headings are set in Big Shoulders, the condensed industrial face of engineering drawings and instrument panels, and every number, label and terminal block is set in JetBrains Mono. Both are bundled with the site under the SIL Open Font License and served from this origin, so the page still makes no third-party request. Running text stays in whatever face the reader already has: a third download would have cost more than the character it bought.
A line of light passes over the page once on arrival, the way a scanner passes over a document. It is also the progress indicator — submit a URL and it loops until the report arrives, which is the only feedback a plain form GET can give.
The agent that does the scanning now appears at the three moments it means something: reading a page while a scan is in flight, and on a finished report as either the good result or the one with problems to fix. It is absent everywhere else.
Small grey text was measured against every surface it sits on and failed WCAG AA on two of them, at 4.28:1 and 4.32:1 against a 4.5:1 threshold. Both values were re-picked by measurement rather than by eye.
Adding the artwork cost a point on our own image-alt check, which was correct to flag it: two of three images were marked decorative and one was an empty placeholder. The images were described properly and the decorative mark moved out of the markup, rather than the rule being softened.
· Product
Every report now opens in plain English, and downloads as a PDF
A report used to begin with a rubric: check ids, pillar weights, impact in points. That is the right output for whoever is going to fix the site and the wrong one for the person who typed their own domain in to find out whether they have a problem. Every report now opens with five questions about consequences — can an assistant open this page, will it describe the business correctly, can it quote the prices — each answered yes, partly or no.
The answers are derived from the pillar scores on the same thresholds the colours use, so the words and the numbers can never disagree. Nothing about them is written by hand per site.
Underneath them is what acting is worth: the configuration-only fixes, the score they would reach, and one line per pillar saying what improves. A defect list that never states the gain is only half a report.
The technical half — all the checks, the evidence and the copy-pasteable snippets — is one click down, and it opens with JavaScript disabled like everything else here.
Every report can be downloaded as a PDF, which is the form it travels in: forwarded to the developer, attached to a proposal, filed next to last quarter. The PDF writer was written for this codebase rather than installed, for the same reason the PNG encoder was — every library that renders a PDF on a server drives a headless browser or compiles native code, and this product ships as one Dockerfile with nothing to install at runtime.
· Specification
The Open Graph check now looks at the image format
An og:image pointing at an SVG, AVIF, BMP or TIFF is marked thin evidence. None of those render in a link preview on Facebook, X, LinkedIn, WhatsApp or Slack, so the card comes out blank — and the only way to find out is to post a link and look at it.
Found on this site. Our own og:image was an SVG, and report pages pointed theirs at the 196x36 badge, which is not a card shape. Both are now generated 1200x630 PNGs, and a report card carries that report’s own score and grade.
A relative og:image is flagged for the same reason: a scraper resolving it from somewhere else gets nothing.
· Product
The command-line scanner is published
npx axray-cli <url> now works with no install and no account. It runs the same scoring modules as this site, from the same package, so the number in your terminal is the number on the report.
The unscoped name axray was refused by npm as too similar to an existing package called ax-ray, so the published name carries the -cli suffix. A global install still gives you the short axray command.
--allow-private lets it scan localhost and other private addresses, which the hosted service will never do: reaching your own dev server is not forgery, reaching ours would be.
· Specification
Checks now measure substance, not just presence
Twenty checks that could be satisfied by an empty artefact gained a substance gate: an llms.txt must say something and link somewhere, a Product must carry offers, a security.txt must name a contact, a manifest must name an endpoint.
A check whose artefact is present but hollow keeps its status, earns at most half its weight, and is labelled "thin evidence" on the report with a sentence naming what is missing.
Scores can move for pages that were passing these checks on an empty file. That is the intended correction, not a regression.
· Policy
The AX Index became opt-in
Scanning a site no longer publishes anything about it. A host appears in the public index only when somebody has proved control of the domain and asked to be listed.
Removal is one click from the report or the dashboard, takes effect immediately, and needs no explanation.
Staging, preview and internal hostnames are never listed, whoever asks.
Every listing that predated these rules was unpublished.
· Policy
Politeness limits and an opt-out
One host is fetched a limited number of times an hour across every user combined, and a crawl counts once per page.
Repeat requests for the same URL are served from a recent result rather than fetched again.
Disallowing AXRAY in your robots.txt now stops the scanner, for everybody, from the next request.
· Specification
AX specification v1.0
First public version: five pillars, 53 checks, published in full and generated from the scoring code.
Scores are comparable within a major version. A change that would move scores gets a new version and an entry here.
The rubric is versioned. Scores are comparable within a major version, and we will not silently
change what a number means — see the specification.