How ARI-100 is computed
One fetch per surface, no browser, no model in the scoring path. The same response always produces the same score, which is what makes the number usable as a regression test.
Domain weights
Eight domains, weights fixed at 100 in total. A domain's score is the weighted share of points it earned over the checks that applied to it.
| Domain | Weight | Checks | Scored on |
|---|---|---|---|
| Reachability & Access | 20 | 15 | robots.txt policy, live reachability for 32 named AI crawlers, indexability, interstitial and edge-block detection. |
| Render & Delivery | 10 | 11 | Server-rendered text before scripts run, status codes, soft-404 detection, TTFB, payload weight and text-to-markup ratio. |
| Structure & Semantics | 12 | 14 | Title, description, a single H1, heading order, self-canonical, language, social tags and control names. |
| Structured Data | 12 | 12 | JSON-LD that parses, page and entity types, sameAs identity, dates, breadcrumbs and price-vs-page agreement. |
| Discovery Files | 14 | 18 | Sitemap, llms.txt shape, llms-full.txt, Markdown mirrors, Accept negotiation, Link headers and the AGENTS.md build guide. |
| Agent Interfaces | 14 | 27 | OpenAPI, RFC 9727 catalog, RFC 9728 and RFC 8414 metadata, MCP card plus a live MCP handshake, A2A and error shapes. |
| Operability & Commerce | 10 | 13 | Search, cart form semantics, variant controls, price in server HTML, guest checkout and policy links. |
| Trust & Authority | 8 | 10 | Author, visible dates, outbound sources, about/contact reachability, legal name, HTTPS hygiene and broken links. |
Check states
Every check resolves to exactly one state. Points are fixed per state, never tuned per site.
| State | Points | Meaning |
|---|---|---|
| pass | 1.0 | The required artefact exists and satisfies the rule on the live response. |
| partial | 0.5 | Present but incomplete, or reached through a redirect, or declared without being verifiable. |
| fail | 0 | Missing, malformed, or contradicted by the live response. |
| inconclusive | null | The probe could not decide; the check leaves the domain denominator. |
| not_applicable | null | Gated out for this site shape; the check leaves the domain denominator too. |
inconclusive exists so a timeout or an unverifiable crawler never reads as a failure. not_applicable exists so a site without a product page is not scored on product markup.
Applicability gating
Two gates change which checks count. The commerce gate applies when the site shows no product surface, no cart path and no product markup: every commerce check except site search becomes not applicable. The interfaces gate applies when there is no development surface at all — no OpenAPI, no MCP card, no API link, nothing about an API in robots.txt — and the whole interfaces domain leaves the denominator rather than scoring zero.
Gating shrinks denominators; it never adds points. A five-page brochure site can reach 100 without a checkout, and a shop with a broken cart cannot.
The emerging-signal bonus
Nine optional signals — an MCP registration, an A2A card, an interface index, a machine payment profile, DNS discovery, a skills index, Markdown negotiation, a full-text mirror — are scored outside the eight domains. Each one that passes adds a point, and the sum is capped at 5. The cap keeps a site from buying a grade with periphery: five bonus points move a 90 to 95, not an 70 to 100.
Grade bands and levels
| Minimum | Grade | Label |
|---|---|---|
| 95 | A+ | Exemplary |
| 90 | A | Agent-native |
| 75 | B | Agent-aware |
| 60 | C | Partly readable |
| 40 | D | Largely invisible |
| 0 | F | Unreadable |
| Level | Name | Requires |
|---|---|---|
| L0 | Hidden | robots.txt and a sitemap |
| L1 | Crawlable | AI crawlers named with a deliberate policy |
| L2 | Agent-readable | Markdown on request and discovery files |
| L3 | Agent-discoverable | an index of machine interfaces |
| L4 | Agent-operable | a callable interface: MCP, A2A or API |
| L5 | Agent-commerce | a checkout an agent can complete |
Levels are computed from specific checks, not from the total: a site can score 88 and sit at L3 because it has no callable interface, or score 74 and sit at L5 because it has a checkout an agent can finish.
Access and accessibility sub-scores
The access score is the weighted share of testable crawlers that were allowed: a crawler that could not be tested leaves the denominator, a crawler blocked by robots.txt or an edge rule counts against it. The accessibility sub-score is the share of applicable static checks on the home page — image alternatives, control names, heading order, landmark structure, viewport and language. It is a floor test, not an audit.
Stated limits
- Verified-identity crawlers cannot be fully tested from one server. Googlebot, bingbot and Applebot answer differently to a verified IP than to a UA string, so a 401 or 403 for those agents is reported as unverifiable rather than blocked, and it leaves the access denominator.
- A snapshot is not a guarantee. One scan is one request per surface at one moment; a CDN rule, a bot-manager score or an A/B bucket can flip the answer minutes later.
- Only the first two internal pages are sampled for server-rendered text. A site can pass the sample and still ship empty product pages.
- Scores are deterministic for a fixed response but not stable across deploys: content, headers and edge rules all move the number.
- Nothing here proves an agent understood the page. ARI-100 measures the affordances an agent needs, not comprehension quality.
- The commerce domain is gated: on a site with no product or cart surface, only the search check is scored and the domain weight is redistributed across the remaining applicable weight.
Read a clean score as "no affordance is obviously missing", never as "an agent understood the page".
Reproducing a scan
Every report is available as JSON and Markdown, and the same engine is reachable from a coding agent over MCP. To reproduce by hand:
curl -s "https://agentpass.dev/api/scan?url=https://example.com" | tee report.json curl -s https://agentpass.dev/report/example.com.md
Engine version 1.0 · 120 checks · 9 bonus signals · report cache TTL 6 hours.