Spec status
Spec versions we score against.
Every audit is stamped with the exact protocol versions in effect on the day it ran. We monitor canonical sources weekly and update pins through reviewed changes.
What is live today
- 82 active checks across 7 categories. 13 retired, 2 parked.
- Weekly spec-drift cron runs on Mondays at 09:00 UTC and checks 10 canonical sources.
- When a source hash changes, we store an observation row and send a digest email to paid tiers.
- Pin updates are applied via reviewed config changes before they become active in new audits.
Page build date: 2026-06-03
Currently pinned
Three pinned protocol versions plus derived surface tracks.
| Surface / protocol | Version | Source | Notes |
|---|---|---|---|
ACP Agentic Commerce Protocol | 2026-04-17 | github.com/agentic-commerce-protocol/agentic-commerce-protocol | Cart, feed, orders, authentication, MCP |
UCP Universal Commerce Protocol | 2026-04-08 | ucp.dev/documentation | BC, PayPal, Stripe as launch partners |
Stripe SPT Shared Payment Token | 2026-04-22.preview | docs.stripe.com/agentic-commerce | Preview spec; flagged on report |
Perplexity Perplexity rubric | derived | docs.perplexity.ai/docs/resources/perplexity-crawlers | Derived from published crawler/feed guidance |
Meta Meta catalog spec | 2026-Q1 | developers.facebook.com/docs/commerce-platform/catalog | Quarterly cadence |
Copilot Microsoft Copilot inference set | v1.3 (inferred) | about.ads.microsoft.com/en/blog + microsoft.com/microsoft-copilot/blog | Inferred from sparse merchant docs; flagged inferred on report |
Active checks
82 checks in the live registry.
Generated from the live check registry on this build. Display IDs are derived from each check's index within its category.
Discovery
25 checks · prefix DISC| ID | Slug | Name | Severity | Revised |
|---|---|---|---|---|
| DISC-1 | bingbot-allowed | Bingbot allowed | HIGH | 2.0.0 · 2026-05-28 |
| DISC-2 | chatgpt-user-allowed | ChatGPT-User allowed | LOW | 2.0.0 · 2026-05-28 |
| DISC-3 | googlebot-allowed-on-products | Googlebot allowed on product paths | CRITICAL | 2.0.0 · 2026-05-28 |
| DISC-4 | llms-txt-present | llms.txt present (informational) | INFO | 2.0.0 · 2026-05-28 |
| DISC-5 | openai-search-bot-allowed | OAI-SearchBot allowed | CRITICAL | 2.0.0 · 2026-05-28 |
| DISC-6 | pdp-not-behind-login | Sampled PDPs are not gated behind a login wall (401 / 403) | HIGH | 2.0.0 · 2026-05-28 |
| DISC-7 | pdp-not-noindex | No sampled PDP returns a noindex directive | HIGH | 2.0.0 · 2026-05-28 |
| DISC-8 | pdp-single-product-page | Each PDP carries at most one Product JSON-LD node | HIGH | 2.0.0 · 2026-05-28 |
| DISC-9 | perplexity-bot-allowed | PerplexityBot allowed | HIGH | 2.0.0 · 2026-05-28 |
| DISC-10 | perplexity-user-allowed | Perplexity-User allowed | LOW | 2.0.0 · 2026-05-28 |
| DISC-11 | products-discoverable-no-js | Product pages discoverable without JavaScript | HIGH | 2.0.0 · 2026-05-28 |
| DISC-12 | products-machine-discoverable | Products are machine-discoverable | HIGH | 2.0.0 · 2026-05-28 |
| DISC-13 | robots-content-type-plain | /robots.txt is served as text/plain | LOW | 2.0.0 · 2026-05-28 |
| DISC-14 | robots-txt-present | robots.txt present at root | HIGH | 2.0.0 · 2026-05-28 |
| DISC-15 | robots-under-500kib | /robots.txt is under 500 KiB (RFC 9309 §2.5 parser cap) | LOW | 2.0.0 · 2026-05-28 |
| DISC-16 | robots-utf8 | /robots.txt is served as UTF-8 | LOW | 2.0.0 · 2026-05-28 |
| DISC-17 | sitemap-declared-in-robots | Sitemap declared in robots.txt | MEDIUM | 2.0.0 · 2026-05-28 |
| DISC-18 | sitemap-entries-escaped | Sitemap <loc> entries are entity-escaped | MEDIUM | 2.0.0 · 2026-05-28 |
| DISC-19 | sitemap-loc-under-2048 | Every sitemap <loc> URL is under 2048 characters | LOW | 2.0.0 · 2026-05-28 |
| DISC-20 | sitemap-resolvable-with-products | Sitemap resolvable and includes at least one product URL | MEDIUM | 2.0.0 · 2026-05-28 |
| DISC-21 | sitemap-same-host | Sitemap entries share the host of the containing sitemap | MEDIUM | 2.0.0 · 2026-05-28 |
| DISC-22 | sitemap-size-limits | Sitemap respects 50 MiB / 50,000-URL caps per document | LOW | 2.0.0 · 2026-05-28 |
| DISC-23 | sitemap-urlset-namespace | Sitemap root declares the sitemaps.org 0.9 namespace | MEDIUM | 2.0.0 · 2026-05-28 |
| DISC-24 | sitemap-utf8 | Sitemap is served as UTF-8 | LOW | 2.0.0 · 2026-05-28 |
| DISC-25 | wildcard-root-disallow | No global wildcard root disallow | CRITICAL | 2.0.0 · 2026-05-28 |
Structured data
12 checks · prefix STRUCT| ID | Slug | Name | Severity | Revised |
|---|---|---|---|---|
| STRUCT-1 | breadcrumb-list-present | BreadcrumbList present on PDPs | LOW | 2.0.0 · 2026-05-28 |
| STRUCT-2 | offer-availability-schema-url | Offer `availability` is a Schema.org URL | HIGH | 2.0.0 · 2026-05-28 |
| STRUCT-3 | offer-item-condition-when-not-new | Offer `itemCondition` is canonical when present | LOW | 2.0.0 · 2026-05-28 |
| STRUCT-4 | offer-price-currency-valid | Offer price + priceCurrency valid | CRITICAL | 2.0.0 · 2026-05-28 |
| STRUCT-5 | product-aggregate-rating-present | Product `aggregateRating` present | LOW | 2.0.0 · 2026-05-28 |
| STRUCT-6 | product-brand-string-or-object | Product `brand` is a string or Brand/Organization object | MEDIUM | 2.0.0 · 2026-05-28 |
| STRUCT-7 | product-description-present | Product `description` present | MEDIUM | 2.0.0 · 2026-05-28 |
| STRUCT-8 | product-image-populated | Product `image` populated | HIGH | 2.0.0 · 2026-05-28 |
| STRUCT-9 | product-jsonld-present | Product JSON-LD present on PDPs | HIGH | 2.0.0 · 2026-05-28 |
| STRUCT-10 | product-name-populated | Product `name` populated | HIGH | 2.0.0 · 2026-05-28 |
| STRUCT-11 | product-offers-present | Product JSON-LD includes `offers` | HIGH | 2.0.0 · 2026-05-28 |
| STRUCT-12 | product-sku-populated | Product `sku` populated | MEDIUM | 2.0.0 · 2026-05-28 |
Product data
4 checks · prefix PROD| ID | Slug | Name | Severity | Revised |
|---|---|---|---|---|
| PROD-1 | product-brand-attribution | Brand attribution on PDPs | HIGH | 2.0.0 · 2026-05-28 |
| PROD-2 | product-gtin-populated | GTIN coverage on PDPs | HIGH | 2.0.0 · 2026-05-28 |
| PROD-3 | product-title-no-placeholders | Product title not a placeholder | MEDIUM | 2.0.0 · 2026-05-28 |
| PROD-4 | product-title-quality | Product title quality (present, not all-caps) | LOW | 2.0.0 · 2026-05-28 |
Policy
15 checks · prefix POL| ID | Slug | Name | Severity | Revised |
|---|---|---|---|---|
| POL-1 | merchant-return-link-reachable | MerchantReturnPolicy merchantReturnLink URL is reachable | MEDIUM | 2.0.0 · 2026-05-28 |
| POL-2 | merchant-return-policy-applicable-country-iso | MerchantReturnPolicy applicableCountry uses ISO 3166-1 alpha-2 codes | MEDIUM | 2.0.0 · 2026-05-28 |
| POL-3 | merchant-return-policy-category-enum | MerchantReturnPolicy returnPolicyCategory uses valid Schema.org enum | MEDIUM | 2.0.0 · 2026-05-28 |
| POL-4 | merchant-return-policy-enums-valid | MerchantReturnPolicy enrichment enums use valid Schema.org values | LOW | 2.0.0 · 2026-05-28 |
| POL-5 | merchant-return-policy-finite-days | MerchantReturnPolicy finite-window has positive merchantReturnDays | HIGH | 2.0.0 · 2026-05-28 |
| POL-6 | merchant-return-policy-option-a-or-b | MerchantReturnPolicy satisfies Option A (country+category) or B (returnLink) | HIGH | 2.0.0 · 2026-05-28 |
| POL-7 | merchant-return-policy-present | MerchantReturnPolicy node present on Product or Offer | HIGH | 2.0.0 · 2026-05-28 |
| POL-8 | offer-shipping-delivery-time-valid | OfferShippingDetails deliveryTime is a valid ShippingDeliveryTime | LOW | 2.0.0 · 2026-05-28 |
| POL-9 | offer-shipping-destination-valid | OfferShippingDetails shippingDestination is a valid DefinedRegion | MEDIUM | 2.0.0 · 2026-05-28 |
| POL-10 | offer-shipping-details-present | Offer JSON-LD carries shippingDetails (OfferShippingDetails) | HIGH | 2.0.0 · 2026-05-28 |
| POL-11 | offer-shipping-rate-valid | OfferShippingDetails shippingRate is a valid MonetaryAmount | MEDIUM | 2.0.0 · 2026-05-28 |
| POL-12 | privacy-policy-page-reachable | Privacy policy page reachable | HIGH | 2.0.0 · 2026-05-28 |
| POL-13 | returns-policy-page-reachable | Returns/refund policy page reachable | MEDIUM | 2.0.0 · 2026-05-28 |
| POL-14 | shipping-policy-page-reachable | Shipping policy page reachable | MEDIUM | 2.0.0 · 2026-05-28 |
| POL-15 | terms-of-service-page-reachable | Terms of service page reachable | HIGH | 2.0.0 · 2026-05-28 |
Trust
9 checks · prefix TRUST| ID | Slug | Name | Severity | Revised |
|---|---|---|---|---|
| TRUST-1 | about-page-reachable | About page reachable with substantive copy | LOW | 2.0.0 · 2026-05-28 |
| TRUST-2 | contact-with-email-or-phone | Contact page exposes email or phone | HIGH | 2.0.0 · 2026-05-28 |
| TRUST-3 | review-app-detected | Third-party review-platform integration detected | MEDIUM | 2.0.0 · 2026-05-28 |
| TRUST-4 | https-and-hsts-enforced | HTTPS enforced sitewide + HSTS (≥ 6-month max-age) | CRITICAL | 2.0.0 · 2026-05-28 |
| TRUST-5 | hsts-include-subdomains | HSTS policy carries the includeSubDomains directive | MEDIUM | 2.0.0 · 2026-05-28 |
| TRUST-6 | hsts-preload-directive | HSTS policy carries the preload directive | LOW | 2.0.0 · 2026-05-28 |
| TRUST-7 | apple-pay-detected | Apple Pay markers detected (informational) | INFO | 2.0.0 · 2026-05-28 |
| TRUST-8 | google-pay-detected | Google Pay markers detected (informational) | INFO | 2.0.0 · 2026-05-28 |
| TRUST-9 | organization-jsonld-with-contact | Organization/OnlineStore JSON-LD with contactPoint on homepage | MEDIUM | 2.0.0 · 2026-05-28 |
Protocol (UCP)
15 checks · prefix PROT| ID | Slug | Name | Severity | Revised |
|---|---|---|---|---|
| PROT-1 | ucp-cache-headers-valid | UCP profile Cache-Control is shared-cacheable with max-age ≥ 60s | HIGH | 2.0.0 · 2026-05-28 |
| PROT-2 | ucp-capability-required-fields | Each capability has version + spec + schema | MEDIUM | 2.0.0 · 2026-05-28 |
| PROT-3 | ucp-mcp-transport-valid | UCP MCP-transport entries have valid HTTPS endpoints | LOW | 2.0.0 · 2026-05-28 |
| PROT-4 | ucp-profile-content-type-json | /.well-known/ucp response Content-Type is application/json | HIGH | 2.0.0 · 2026-05-28 |
| PROT-5 | ucp-profile-no-auth-required | /.well-known/ucp is publicly fetchable with no auth | HIGH | 2.0.0 · 2026-05-28 |
| PROT-6 | ucp-profile-no-redirects | /.well-known/ucp returns 200 directly with no redirects | HIGH | 2.0.0 · 2026-05-28 |
| PROT-7 | ucp-profile-present | /.well-known/ucp profile is present with a `version` field | HIGH | 2.0.0 · 2026-05-28 |
| PROT-8 | ucp-profile-required-keys | UCP profile carries all four required top-level keys | HIGH | 2.0.0 · 2026-05-28 |
| PROT-9 | ucp-service-spec-url-origin-matches | Each service's `spec` URL origin matches its namespace authority | MEDIUM | 2.0.0 · 2026-05-28 |
| PROT-10 | ucp-service-transport-conditional-fields | Each service satisfies the transport-conditional field requirements | HIGH | 2.0.0 · 2026-05-28 |
| PROT-11 | ucp-service-transport-enum | Each service `transport` is rest, mcp, a2a, or embedded | HIGH | 2.0.0 · 2026-05-28 |
| PROT-12 | ucp-service-version-date-format | Every service `version` matches YYYY-MM-DD | MEDIUM | 2.0.0 · 2026-05-28 |
| PROT-13 | ucp-shopping-service-valid | UCP profile declares a valid shopping service entry | HIGH | 2.0.0 · 2026-05-28 |
| PROT-14 | ucp-signing-keys-valid | Every signing_keys[] entry is a valid JWK | HIGH | 2.0.0 · 2026-05-28 |
| PROT-15 | webmcp-declarative-tools-valid | Declarative WebMCP forms are valid | LOW | 2.0.0 · 2026-05-30 |
Images
2 checks · prefix IMG| ID | Slug | Name | Severity | Revised |
|---|---|---|---|---|
| IMG-1 | image-area-50k-pixels | Product images meet Google’s 50,000-pixel area threshold | LOW | 2.0.0 · 2026-05-28 |
| IMG-2 | image-alt-text-coverage | Alt text on at least 80% of PDP images | LOW | 2.0.0 · 2026-05-28 |
Parked checks
Written but inactive.
Parked checks live in the repo as code but don't run in the public audit. They're restored when their mode becomes available (e.g., uploaded-mode feed checks resume when merchants can upload an ACP feed file).
| Slug | Note | Restored when |
|---|---|---|
| acp-feed-conformance | ACP feed shape conformance (uploaded mode) | Uploaded mode ships |
| acp-feed-freshness-25h | ACP feed last-modified within 25 hours (uploaded mode) | Uploaded mode ships |
Retired checks
13 checks removed since launch.
Slugs in this ledger are never reused. We keep the full list so historical audit data still resolves to a meaningful name, and so you can see why each check was retired.
| Slug | Legacy ID | Reason | Replaced by | Retired | Note |
|---|---|---|---|---|---|
| acp-feed-conformance | FEED-001 | Mode mismatch | — | 2.0.0 · 2026-05-28 | Always returned na in public mode; moved to parked/feed/ registry. Restored when uploaded mode ships (merchant uploads ACP feed file). |
| acp-feed-freshness-25h | FEED-008 | Mode mismatch | — | 2.0.0 · 2026-05-28 | Feed freshness is an uploaded/connected-mode concern; moved to parked/feed/. Restored when uploaded mode ships. |
| gmc-signal-from-gtm | FEED-004 | Wrong thing tested | — | 2.0.0 · 2026-05-28 | GTM container presence does not prove GMC account state; UCP-tagged but no UCP basis. |
| meta-pixel-catalog-signal | FEED-005 | Wrong thing tested | — | 2.0.0 · 2026-05-28 | Meta Pixel presence does not prove catalog connection. |
| pdp-min-3-images | IMG-003 | Invented threshold | image-area-50k-pixels | 2.0.0 · 2026-05-28 | Replaces ≥3 images with Google merchant listing’s only quantitative image rule (≥50,000 pixels). |
| product-description-min-100-chars | SD-004 | Invented threshold | product-description-present | 2.0.0 · 2026-05-28 | 100-char threshold not in any cited spec; replaced by simpler presence check. |
| product-description-min-200-chars | PD-005 | Duplicate intent | product-description-present | 2.0.0 · 2026-05-28 | Duplicated SD-004 at an invented stricter threshold (200 chars not in any spec). |
| product-jsonld-min-3-images | PD-007 | Invented threshold | image-area-50k-pixels | 2.0.0 · 2026-05-28 | Schema.org/image has no minimum count requirement. |
| product-title-length-30-150 | PD-003 | Invented threshold | product-title-quality | 2.0.0 · 2026-05-28 | 30-150 char threshold is GMC guidance, not ACP; replaced by Google merchant listing actual rule. |
| returns-page-refund-timeline-prose | POL-003 | Duplicate intent | merchant-return-policy-present | 2.0.0 · 2026-05-28 | Prose regex on refund timeline is covered by JSON-LD MerchantReturnPolicy check. |
| returns-page-return-window-prose | POL-001 | Duplicate intent | merchant-return-policy-finite-days | 2.0.0 · 2026-05-28 | Prose regex on returns page is covered by JSON-LD MerchantReturnPolicy.merchantReturnDays check. |
| shipping-page-speed-prose | POL-002 | Duplicate intent | offer-shipping-delivery-time-valid | 2.0.0 · 2026-05-28 | Prose regex on shipping page is covered by JSON-LD OfferShippingDetails.deliveryTime check. |
| stripe-markers-homepage | TXN-005 | Wrong thing tested | — | 2.0.0 · 2026-05-28 | Stripe.js presence on homepage is not Stripe agentic-commerce (SPT) capability; sandbox-verifiable only. |
Watch sources
The canonical sources we diff.
- 01raw.githubusercontent.com/agentic-commerce-protocol/agentic-commerce-protocol/main/README.md
- 02developers.openai.com/commerce/specs/feed
- 03ucp.dev/documentation/core-concepts/
- 04raw.githubusercontent.com/Universal-Commerce-Protocol/ucp-schema/main/README.md
- 05docs.stripe.com/agentic-commerce
- 06support.google.com/merchants/answer/16837055
- 07docs.perplexity.ai/docs/resources/perplexity-crawlers
- 08developers.facebook.com/docs/commerce-platform/catalog/fields/
- 09about.ads.microsoft.com/en/blog
- 10www.shopify.com/news
Coming soon
Next upgrades to spec operations.
- Public diff history table driven by live observation rows (instead of static examples).
- Automatic bulk re-score workflow on pinned-version bumps.
- Retrospective API mode for explicit historical-spec reruns.
Today, score changes still appear through normal re-audit runs and the dashboard monitoring cycle.
Run it