Labs · 20 fixture families

Stores built to be measured.

Each lab is a public, semantic-HTML page set. KeyPages.ai adds them as commerce pages and watches what the scanner sees.

All-Green Northwind
Live/labs/northwind
Reference storefront

All-Green Northwind

Deterministic ecommerce surface: home, collection, product, cart, checkout-entry, search, account, pricing. Built to pass every KeyPages commerce check.

Open store
Missing Add-to-Cart
Live/labs/missing-add-to-cart
PDP regression

Missing Add-to-Cart

Product page renders normally but the add-to-cart control is gone from the DOM. Tests purchase-path detection.

Open store
Disabled Add-to-Cart
Live/labs/disabled-add-to-cart
PDP regression

Disabled Add-to-Cart

Add-to-cart is present but rendered in a disabled state. Tests whether scanners distinguish interactive vs inert controls.

Open store
Missing Checkout Button
Live/labs/missing-checkout-button
Cart regression

Missing Checkout Button

Cart page is intact but the checkout CTA is removed. Tests funnel-step coverage when a single button vanishes.

Open store
Checkout Redirects Home
Live/labs/checkout-redirects-home
Silent funnel break

Checkout Redirects Home

The checkout-entry route silently redirects back to the homepage. Tests redirect-chain evidence and alert confidence.

Open store
Search Returns Zero
Live/labs/search-zero-results
Search regression

Search Returns Zero

Every search query returns an empty result set, no matter the term. Tests query-template baseline diffs.

Open store
Account Login Missing
Live/labs/account-login-missing
Auth surface regression

Account Login Missing

The account URL renders a Login Unavailable page while the rest of the site stays up. Tests auth-surface presence monitoring.

Open store
Empty Collection Grid
Live/labs/collection-grid-empty
Catalog regression

Empty Collection Grid

Collection page loads but renders zero product tiles. Tests catalog-density signals and empty-state detection.

Open store
Pricing — Missing Prices
Live/labs/pricing-missing-prices
Pricing regression

Pricing — Missing Prices

Pricing tiers render with names and features, but every price value is gone. Tests price-element baseline diff.

Open store
Pricing — Missing CTA
Live/labs/pricing-missing-cta
Pricing regression

Pricing — Missing CTA

Pricing tiers keep their prices but lose their CTAs. Tests conversion-path coverage on the pricing surface.

Open store
Critical Script Removed
Live/labs/critical-script-removed
Legacy marker fixture

Critical Script Removed

Legacy inline-marker fixture retained for compatibility. Use the paired critical-checkout-script gate for detector proof.

Open store
All-Green SaaS
Live/labs/saas-happy-path
SaaS reference site

All-Green SaaS

Healthy B2B SaaS marketing site: home, product, pricing, trial signup, demo, login, docs. No cart or checkout.

Open store
Directory · 12 of 12

Every lab, sortable and searchable.

PathOpen
Account Login MissingAuth surface regressionLive/labs/account-login-missingOpen
All-Green NorthwindReference storefrontLive/labs/northwindOpen
All-Green SaaSSaaS reference siteLive/labs/saas-happy-pathOpen
Checkout Redirects HomeSilent funnel breakLive/labs/checkout-redirects-homeOpen
Critical Script RemovedLegacy marker fixtureLive/labs/critical-script-removedOpen
Disabled Add-to-CartPDP regressionLive/labs/disabled-add-to-cartOpen
Empty Collection GridCatalog regressionLive/labs/collection-grid-emptyOpen
Missing Add-to-CartPDP regressionLive/labs/missing-add-to-cartOpen
Missing Checkout ButtonCart regressionLive/labs/missing-checkout-buttonOpen
Pricing — Missing CTAPricing regressionLive/labs/pricing-missing-ctaOpen
Pricing — Missing PricesPricing regressionLive/labs/pricing-missing-pricesOpen
Search Returns ZeroSearch regressionLive/labs/search-zero-resultsOpen
Next KeyPages gates · 8 fixture families

Paired and stateful fixtures for the next detection gates.

Operator directory. Each family pairs a broken condition with a healthy control built from the same layout. Expected test keys describe intent only — nothing here is a KeyPages result.

pairedSame-origin checkout script

Critical checkout script removed

Checkout still renders, but the required checkout script no longer loads.

lab_id:
critical-checkout-script
expected_test_key:
commerce_checkout_script_failure
expected_http_status:
200 on both routes
fixture_version:
1
  • Healthy /labs/critical-checkout-script/healthy/checkoutloads same-origin checkout script
  • Broken /labs/critical-checkout-script/broken/checkoutcheckout script never requested
paired

HTTP 200 JavaScript crash

The page returns 200 and looks fine, but JavaScript fails and the primary action does not work.

lab_id:
js-crash-http-200
expected_test_key:
js_crash
expected_http_status:
200 on both routes
fixture_version:
1
  • Healthy /labs/js-crash-http-200/healthy
  • Broken /labs/js-crash-http-200/brokenuncaught YAMAYAMA_INTENTIONAL_JS_CRASH
paired

Blank page vs application shell only

A page renders nothing at all, or renders chrome and a loading skeleton without real content.

lab_id:
render-integrity-states
expected_test_key:
blank_page | script_shell_only
expected_http_status:
200 on all three routes
fixture_version:
1
  • Healthy /labs/render-integrity-states/healthy
  • Blank /labs/render-integrity-states/blank
  • Shell only /labs/render-integrity-states/shell-only
pairedRequires server behavior

Browser/network failure vs server outage

A verified customer outage must be distinguished from a capture failure with no trustworthy evidence.

lab_id:
failure-classification
expected_test_key:
http_status_failure
expected_http_status:
200 healthy, 503 outage, 302 to transport abort
fixture_version:
1
  • Healthy /labs/failure-classification/healthy
  • Server outage (503) /labs/failure-classification/server-outage
  • Browser error /labs/failure-classification/browser-errorredirects to an aborting transport endpoint
pairedRequires server behavior

HTTP 429 rate limit and cooldown

The site temporarily rate-limits the scanner; monitoring should cool down and retry, not declare an outage.

lab_id:
rate-limit-cooldown
expected_test_key:
none
expected_http_status:
200 healthy, 429 with Retry-After: 120
fixture_version:
1
statefulDurable state required

Full failure and recovery lifecycle

A real issue must stay confirmed while broken and clearly recover once the page is fixed.

lab_id:
recovery-toggle
expected_test_key:
commerce_add_to_cart_disabled
expected_http_status:
200 in both modes
fixture_version:
1
paired

Checkout provider missing

Checkout and order summary render, but the expected payment provider experience is absent.

lab_id:
checkout-provider-missing
expected_test_key:
commerce_checkout_provider_missing
expected_http_status:
200 on both routes
fixture_version:
1
  • Healthy /labs/checkout-provider-missing/healthy/checkoutinert Stripe Elements evidence
  • Broken /labs/checkout-provider-missing/broken/checkoutprovider evidence removed only
statefulDurable state required

Major DOM drop after a healthy baseline

A page still returns 200 but loses most of its meaningful content after previously working.

lab_id:
major-dom-drop
expected_test_key:
major_dom_drop
expected_http_status:
200 in both modes
fixture_version:
1