agentspeed.
Specification · Public · Versioned

The AgentSpeed Rubric

r2026.07.1activebands v1published 2026-07-20

The AgentSpeed Rubric is the specification for computing scores published at /score/<domain>. It enumerates every check, its weight, and the grade bands that map a composite into a letter. Versions are immutable (§10); historical scans render against the rubric they were computed on. Class weight policy in §11.1 caps how much of a score can come from heuristic or model-assisted checks.

Based on 30 checks · 20 deterministic · 9 heuristic · 1 model-assisted.

Summary

AgentSpeed scores whether AI agents can discover, read, understand, and act on your website.

Five sub-scores combined into a 0–100 composite, mapped to a letter grade A–F. The full mathematical specification is below. This overview is for everyone else.

Rubric version
Current version
r2026.07.1
Published
2026-07-20
Total checks
30
Deterministic
20
Heuristic
9
Model-assisted
1
Grade bands
bands v1
Versions are immutable. Historical scans render against the rubric they were computed on.View changelog →
Categories
Discoverability22% weight

what it measures

How easily an agent finds canonical content and capability manifests: robots.txt, llms.txt, sitemap, OAuth metadata, MCP server card.

why it matters

If agents can't find your canonical pages, every other score is academic. The page won't show up in agent answers.

example checks

Readability22% weight

what it measures

How much primary content is available without executing JavaScript, and whether structural signals (headings, title, meta description, markdown negotiation) are correct.

why it matters

Agents read raw HTML before they render. A site that hides its hero behind a JS bundle is a site agents quote a footer about.

example checks

Structured data13% weight

what it measures

Whether JSON-LD is present, validates against schema.org, and covers the apparent purpose of the page.

why it matters

Typed data lets agents quote prices, authors, and FAQ answers verbatim. Without it, agents guess from prose and hallucinate.

example checks

Actionability28% weight

what it measures

Whether an agent can identify the primary offering and its call-to-action, and whether the site exposes in-page agent surfaces (Agent Skills, WebMCP).

why it matters

Reading is half the work. If an agent can't tell what the site offers or how to act on it, it stops at the homepage.

example checks

Performance15% weight

what it measures

Time-to-first-byte, full render, and total page weight, measured against thresholds chosen for typical agent timeouts.

why it matters

Most agents abort at 6s. A page that renders for humans in 8s is invisible to agents and to the answers they generate.

example checks

How to read your score

Why skipped checks do not inflate the score. Skipped checks are excluded from both the numerator and denominator of their sub-score. We do not count skip as a pass (which would inflate) or as a fail (which would unfairly punish sites for not adopting an opt-in capability). A site that legitimately does not run an API will have api.* checks skip and a sub-score computed only over the checks that ran.

What counts as agent-ready?
  1. 01
    Agents can find your important pages

    robots.txt allows known agent UAs, sitemap.xml lists canonical URLs, and /llms.txt points at docs and pricing.

  2. 02
    Agents are not blocked accidentally

    No inherited User-agent: * disallow blocks GPTBot / ClaudeBot, and no Cloudflare challenge fires on agent traffic.

  3. 03
    Agents can read content without broken JS

    Primary content renders server-side. JavaScript is enhancement, not requirement.

  4. 04
    Agents can parse structured data

    JSON-LD blocks are present, validate against schema.org, and cover the page kind (Product, Article, FAQPage, BreadcrumbList).

  5. 05
    Agents can identify pricing or CTA

    Pricing is reachable as text or Offer schema. The primary CTA is a real link with text, not a JS-only button.

  6. 06
    Agents can load the page quickly

    TTFB and full render fit within typical agent timeouts (around 6 seconds).

↓ full specification below ↓

§1 Status of this document

This is version r2026.07.1, published 2026-07-20. It does not retroactively rescore scans run against earlier versions (see §10). The file that produced this document is under version control; its content hash is part of every permalinked scan's citation (see §13). Older deprecated versions are listed in §12.

§2 Terminology
checka single rule evaluated against a target site. Returns one of pass, warn, fail, skip, blocked.
probea check whose evaluation involves a language model. Probes are enumerated in §9. Every other check is deterministic or heuristic.
deterministica check whose rule references an external specification (RFC, W3C, IETF draft, schema.org). No AgentSpeed-chosen thresholds. Re-running on identical bytes produces an identical output as long as the rubric version is unchanged.
heuristica check whose rule is fixed code but whose threshold or match pattern was chosen by AgentSpeed rather than by a published standard. Bitwise reproducible against the same rubric; a different rubric can legitimately disagree. The chosen parameter is shown inline in §6 and catalogued in §8.
sub-scorea weighted average, in the range 0 to 100, of the checks belonging to one of five categories. See §5.
compositethe weighted average of the five sub-scores. Range 0 to 100. Rendered with one decimal place.
gradea letter derived from the composite via the current grade bands (§7).
findinga check result that produced a warn or fail, surfaced on the public score page with a severity and a remediation page.
remediationa markdown document attached to a finding; permalinked at /score/<domain>/fix/<checkKey>.
§3 Principles
  1. Public. Every check, weight, and band is documented on this page.
  2. Reproducible. Identical input produces an identical score, within the measurement error introduced by the target site changing between runs.
  3. Versioned. Rubric changes produce a new version identifier. Historical scans retain the version they were computed on.
  4. Conservative. When a check cannot be evaluated (timeout, block, robots disallow), it returns skip and is excluded from its sub-score denominator. Skips never inflate the composite.
  5. Agent-first. Checks measure properties that matter to automated clients (ChatGPT, Perplexity, Claude, Operator, and named crawlers such as GPTBot and ClaudeBot), not human visitors.
§4 Scoring pipeline

A scan executes the following steps in order:

  1. Accept a URL. Normalise to origin, enforce https, apply the host policy (private IPs, reserved TLDs, and AgentSpeed-owned hosts are rejected).
  2. Fetch the canonical document. The scanner uses the AgentSpeedBot/1.0 user-agent and a fixed viewport 1280×800. Redirects are followed to a maximum of one hop.
  3. Render once with a headless browser and capture the resulting DOM and network waterfall.
  4. Evaluate every check in §6 against the captured artefacts.
  5. For each sub-score s, compute sub_score(s) = 100 × Σ(value(c) × weight(c)) / Σ(weight(c)) over checks c in category s whose status is not skip or blocked. Check values are pass = 1, warn = 0.5, fail = 0.
  6. Compute the composite: composite = Σ(sub_score(s) × sub_weight(s)) / Σ(sub_weight(s)).
  7. Resolve the grade by walking the grade bands (§7) from highest to lowest min and selecting the first band where composite ≥ min.
  8. Generate findings for every fail and warn and persist them alongside the scan.
§5 Sub-scores
discoverability
22%
readability
22%
structured_data
13%
actionability
28%
performance
15%
discoverabilityHow easily an agent finds canonical content and capability manifests: robots.txt, llms.txt, sitemap, OAuth metadata, MCP server card, Web Bot Auth.
readabilityHow much of the primary content is available without executing JavaScript, and whether structural signals (headings, title, meta description, markdown negotiation) are correct.
structured_dataWhether JSON-LD is present, validates, and covers the apparent purpose of the page.
actionabilityWhether an agent can identify the primary offering and its call-to-action, and whether the site exposes in-page agent surfaces (Agent Skills, WebMCP).
performanceTime-to-first-byte, full render, and total page weight, measured against thresholds chosen for typical agent timeouts.
§6 Check catalogue

Every check that contributes to the composite on r2026.07.1, grouped by sub-score. determinism marks whether a check is evaluated by fixed rules or involves a language model (§8, §9); weight is the check's contribution to its sub-score before normalisation.

discoverability12 checks · click to expand
keydescriptiondeterminismweight
robots_txt.presentA reachable robots.txt exists at the site root. spec ↗
deterministic
1
robots_txt.allows_known_agentsrobots.txt does not disallow well-known agent user-agents (GPTBot, ChatGPT-User, PerplexityBot, ClaudeBot, Google-Extended, Applebot-Extended). spec ↗
deterministic
2
robots_txt.content_signalsrobots.txt advertises Content-Signal directives (e.g. `Content-Signal: ai-train=no, ai-summarize=yes`) that let agents respect granular usage preferences. spec ↗
deterministicemerging
1
llms_txt.presentAn llms.txt file at the site root helps agents locate your most-important content. spec ↗
deterministic
2
sitemap.presentA sitemap.xml is reachable and referenced from robots.txt. spec ↗
deterministic
2
discoverability.link_headersHTTP `Link:` response headers carry useful relations (canonical, alternate, describedby) that agents consume without parsing HTML. spec ↗
deterministic
1
markup.canonicalA canonical URL is declared and resolves to the same page. spec ↗
deterministic
2
discoverability.mcp_server_cardAn MCP Server Card is reachable at `/.well-known/mcp/server-card.json` (or referenced from a Link header) and validates against the Model Context Protocol spec. spec ↗
deterministicemerging
1
discoverability.oauth_authorization_server`/.well-known/oauth-authorization-server` is reachable and conforms to RFC 8414, letting agents discover authorization endpoints without out-of-band setup. spec ↗
deterministicemerging
1
discoverability.oauth_protected_resource`/.well-known/oauth-protected-resource` is published per RFC 9728 so agents can discover required scopes and authorization servers programmatically. spec ↗
deterministicemerging
1
discoverability.api_catalogAn API catalog is published at `/.well-known/api-catalog` (RFC 9727) or an OpenAPI document is reachable at `/openapi.json` or `/openapi.yaml`. spec ↗
deterministicemerging
1
discoverability.web_bot_authThe site signals support for the Web Bot Auth IETF draft (HTTP Message Signatures over a known JWKS) so well-behaved agents can prove identity. spec ↗
deterministicemerging
1
readability7 checks · click to expand
keydescriptiondeterminismweight
readability.markdown_negotiationRequests with `Accept: text/markdown` return a markdown representation of the page (Markdown content negotiation). spec ↗
deterministicemerging
1
content.text_ratioVisible text makes up at least 15% of the rendered DOM weight.
heuristicmin text ratio = 15%
1
content.js_required_for_primary_contentPrimary content is visible without JavaScript.
heuristicdetector = no-JS visibility heuristic
2
content.headings_hierarchyHeading hierarchy is well-formed (one H1, no skipped levels). spec ↗
heuristicrule = single H1, no skipped levels
1
auth.cookie_consent_blocks_contentA cookie-consent modal does not cover or block the primary content on first load.
heuristicdetector = consent overlay heuristic
2
markup.titleA non-empty <title> is present and under 70 characters. spec ↗
deterministic
2
markup.meta_descriptionA meta description is present and between 50 and 200 characters. spec ↗
deterministic
2
structured_data3 checks · click to expand
keydescriptiondeterminismweight
structured_data.jsonld_presentAt least one valid JSON-LD block is present. spec ↗
deterministic
2
structured_data.validatesJSON-LD validates against the declared schema.org type. spec ↗
deterministic
2
structured_data.type_coverageDeclared JSON-LD types cover the apparent page purpose (e.g. a product page has Product, a blog post has Article).
heuristicmatch = type-to-purpose inference
1
actionability5 checks · click to expand
keydescriptiondeterminismweight
auth.paywall_or_login_wall_on_landingLanding URL is not gated by a login or paywall.
heuristicdetector = paywall/login-wall heuristic
2
journey.primary_probeA read-only LLM-driven probe can identify the primary offering and either its price or its primary call-to-action.
model-assisted
2
reachability.statusLanding URL returns a 2xx after at most one redirect. spec ↗
deterministic
2
actionability.agent_skillsAn Agent Skills manifest is reachable (e.g. `/.well-known/agent-skills.json`) describing discrete tasks an agent can perform on the site.
deterministicemerging
1
actionability.web_mcpThe page exposes WebMCP (in-browser Model Context Protocol) so on-page agents can invoke tools without leaving the tab.
deterministicemerging
1
performance3 checks · click to expand
keydescriptiondeterminismweight
performance.ttfb_msTime-to-first-byte is under 800ms from a US-East origin. spec ↗
heuristicthreshold = 800ms
2
performance.full_render_msFull render (network idle) completes under 4 seconds.
heuristicthreshold = 4s
1
performance.payload_kbTotal page weight is under 3 MB.
heuristicthreshold = 3MB
1
§7 Grade bands
A
90
B
80
C
70
D
60
F
0

Grade bands are versioned independently (bands v1). A change in the band cutoffs bumps the band version and is treated equivalently to a rubric change for historical preservation (§10).

§8 Heuristic checks

9 checks in r2026.07.1 are heuristic: the scanner evaluates a fixed rule, but the threshold or match pattern was chosen by AgentSpeed rather than by an external specification. Heuristic checks are bitwise reproducible (two scans on identical bytes against the same rubric produce identical results), but a different rubric can legitimately disagree. The chosen parameter is rendered inline in §6 and enumerated below. Thresholds are versioned with the rubric (§11); a change in a threshold requires a rubric version bump.

keyparametervalue
content.text_ratiomin text ratio15%
content.js_required_for_primary_contentdetectorno-JS visibility heuristic
content.headings_hierarchyrulesingle H1, no skipped levels
auth.cookie_consent_blocks_contentdetectorconsent overlay heuristic
structured_data.type_coveragematchtype-to-purpose inference
auth.paywall_or_login_wall_on_landingdetectorpaywall/login-wall heuristic
performance.ttfb_msthreshold800ms
performance.full_render_msthreshold4s
performance.payload_kbthreshold3MB
§9 Model-assisted checks

One check in r2026.07.1 is model-assisted: journey.primary_probe. The probe is a single, read-only request to an Anthropic model (claude-haiku-4-5-20251001 at the time of publication) that returns a structured JSON classification of the page's primary offering and price-or-CTA. The probe performs no tool calls and visits no other URL. Its prompt, model, and decoding temperature are fixed for the lifetime of the rubric version; changes to any of the three produce a new rubric version.

The following constraints bind every model-assisted check and MUST hold in any future probe added to the rubric:

§10 Historical preservation

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.

§11 Versioning policy

Rubric versions follow the form rYYYY.MM.PATCH.

Grade bands carry a separate integer version (v1, v2, …). A band-cutoff change bumps the grade-band version but not the rubric version.

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.

§11.1 Class weight policy

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:

measurecurrenttargetstatus
deterministic share65.9%≥ 60%
within
heuristic share29.5%≤ 30%
within
model-assisted share4.5%≤ 10%
within
max single model-assisted weight2≤ 2
within
§12 Changelog
versionstatuspublishedchangesfile sha
r2026.07.1active2026-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 3d7f8d8
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 37dfdab
r2026.04.1deprecated2026-04-01Initial rubric: 20 checks across 5 sub-scores.sha 8024d8a
§13 How to cite a score

A citation names the domain, the rubric version, the scan ID, and the scan timestamp:

stripe.com · r2026.07.1 · scan 1a2b3c4d · 2026-04-27T14:30Z

This is what appears at the top of every /score/<domain>/scan/<scanId> permalink. The scan ID is the canonical identifier; the other three fields are redundant context that travels with it.