Research/04-Web-Reality-Catalog.md
Web Reality Catalog — Empirical Grounding
┌──────────────────────────────────────────┐
│ INGESTION TASK │
│ (the wiring + the trigger/schedule) │
└──────────────────────────────────────────┘
│
┌───────────────────────────────┼───────────────────────────────┐
▼ ▼ ▼
┌─────────────┐ ┌────────────────┐ ┌──────────────┐
│ SOURCE │ ──fetch───► │ TRANSFORMATION │ ──reshape──► │ DESTINATION │
│ (where data │ │ (optional code/ │ │ (the Algolia │
│ comes from)│ │ no-code step) │ │ index) │
└─────────────┘ └────────────────┘ └──────────────┘
▲ │
│ ▼
┌──────────────┐ indexed records
│AUTHENTICATION│ holds the credentials (API tokens, OAuth,
│ (credentials)│ basic auth) that a Source/Destination uses
└──────────────┘
Each execution of a Task is a RUN. Each per-record outcome inside a run is an EVENT.
RUNs + EVENTs are the observability layer (did it work, what failed, why).
Extracted from 00-Plan.md §14. Hard data from Web Almanac 2024 and a 60-site empirical audit conducted during planning. The cascade order, fallback strategies, and risk register all derive from these findings.
Source of truth: 00-Plan.md §14.
14. Web Reality Catalog — empirical grounding
This section anchors the plan in real-world data, not assumptions. All numbers below are sourced from HTTP Archive's Web Almanac 2024 (a census of ~16M websites) and from a 14-site empirical audit conducted during planning. The cascade order, fallback strategies, and risk register all derive from these findings.
14a. Structured-data adoption (Web Almanac 2024)
| Format | Adoption (mobile pages) | Trend |
|---|---|---|
| OpenGraph | 64% | Stable, ubiquitous on social-aware sites |
| RDFa | 66% | Declining; mostly legacy WordPress/Drupal |
| JSON-LD | 41% | Fastest growing (was 34% in 2022) |
| Microdata | 26% | Niche; mostly older WP/Drupal templates |
| None of the above | ~37% | Pure HTML, no structured data |
Top JSON-LD @type values on mobile pages:
- WebSite — 12.7%
- Organization — 7.2%
- BreadcrumbList — 5.7%
- LocalBusiness — 4.0%
- ItemList — 2.4%
- BlogPosting — 1.4%
- Product — 0.8%
- Article — 0.18%
- FAQPage, HowTo, Course, Recipe, Review — each
curl -X POST "https://data.us.algolia.com/1/sources" \
-H "x-algolia-application-id: $ALGOLIA_APP_ID" \
-H "x-algolia-api-key: $ALGOLIA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"type": "json",
"name": "Product feed (JSON)",
"input": {
"url": "https://example.com/products.json"
},
"authenticationID": "6c02aeb1-775e-418e-870b-1faccd4b2c0f"
}'
0.5%
Key implication: Even when JSON-LD is present, it usually only declares structural types (WebSite, Organization, BreadcrumbList) — not content-classifying types (BlogPosting, Article, Product). Content-class JSON-LD is on roughly 7% of pages globally. A factory that depends on JSON-LD for content-domain classification will fail on
// tool: mcp__algolia__createSource
{
"type": "json",
"name": "Product feed (JSON)",
"input": { "url": "https://example.com/products.json" },
"authenticationID": "6c02aeb1-775e-418e-870b-1faccd4b2c0f"
}
90% of the web.
Source:
curl -X POST "https://data.us.algolia.com/1/destinations" \
-H "x-algolia-application-id: $ALGOLIA_APP_ID" \
-H "x-algolia-api-key: $ALGOLIA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"type": "search",
"name": "Products index destination",
"input": { "indexName": "products" }
}'
https://almanac.httparchive.org/en/2024/structured-datacurl -X POST "https://data.us.algolia.com/2/tasks" \
-H "x-algolia-application-id: $ALGOLIA_APP_ID" \
-H "x-algolia-api-key: $ALGOLIA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"sourceID": "6c02aeb1-775e-418e-870b-1faccd4b2c0f",
"destinationID": "c1f8c5 a8-...-...",
"action": "replace",
"cron": "0 2 * * *",
"enabled": true
}'
14b. Sitemap // tool: mcp__algolia__createTask
{
"sourceID": "6c02aeb1-775e-418e-870b-1faccd4b2c0f",
"destinationID": "c1f8c5a8-...",
"action": "replace",
"cron": "0 2 * * *",
"enabled": true
}
robots.txt adoption (Web Almanac 2024)
// tool: mcp__algolia__createTask
{
"sourceID": "6c02aeb1-775e-418e-870b-1faccd4b2c0f",
"destinationID": "c1f8c5a8-...",
"action": "replace",
"cron": "0 2 * * *",
"enabled": true
}
- robots.txt presence: 83.9% of sites (mobile)
- Sitemap protocol limits: 50,000 URLs OR 50 MB per file (uncompressed). Gzip permitted.
- Sitemap-index nesting: Per spec, only ONE level of nesting is allowed — a sitemap-index can point to urlsets, but not to other sitemap-indexes. (Some sites violate this; treat as best-effort with cycle prevention.)
- Sitemap discoverability: Web Almanac 2024 doesn't publish %, but inferred to be < 60% based on robots.txt-vs-sitemap correlation.
Plan impact: The walker must handle gzipped sitemaps (.xml.gz) natively. The plan's /sitemap.xml, /sitemap_index.xml, /sitemap-index.xml fallback list is correct. <lastmod> is reliable on enterprise/government sites; <changefreq> and <priority> are nearly useless (rarely populated).
Sources:
curl -X POST "https://data.us.algolia.com/2/tasks/{taskID}/run" \
-H "x-algolia-application-id: $ALGOLIA_APP_ID" \
-H "x-algolia-api-key: $ALGOLIA_API_KEY"
https://almanac.httparchive.org/en/2024/seo// tool: mcp__algolia__runTask
{ "taskID": "76ab4c2a-ce17-4b92-..." }
, curl -X POST "https://data.us.algolia.com/2/tasks/{taskID}/push" \
-H "x-algolia-application-id: $ALGOLIA_APP_ID" \
-H "x-algolia-api-key: $ALGOLIA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"action": "addObject",
"records": [
{ "objectID": "prod-123", "name": "Yoga pants", "price": 49 }
]
}'
https://www.sitemaps.org/protocol.html// tool: mcp__algolia__pushTask
{
"taskID": "76ab4c2a-ce17-4b92-...",
"action": "addObject",
"records": [ { "objectID": "prod-123", "name": "Yoga pants", "price": 49 } ]
}
14c. Semantic HTML adoption (Web Almanac 2024)
| Element | Adoption |
|---|---|
<h1> |
~70% |
<h2> |
~71% |
<h3> |
~59% |
<article> |
NOT REPORTED (estimated <10%; 14-site sample showed ~5%) |
<main> |
NOT REPORTED (estimated <10%) |
<time> with datetime |
NOT REPORTED (estimated <10%) |
Plan impact: Semantic HTML5 elements (<article>, <main>, <time>) are unreliable signals. The plan's earlier reliance on these for heuristic classification is wrong. Strip them to layer 7 (low confidence). Use heading hierarchy (<h1>/<h2>/<h3>) which IS widely adopted.
Source:
curl -X POST "https://data.us.algolia.com/1/push/products" \
-H "x-algolia-application-id: $ALGOLIA_APP_ID" \
-H "x-algolia-api-key: $ALGOLIA_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "action": "addObject", "records": [ { "objectID": "p1", "name": "Item" } ] }'
https://almanac.httparchive.org/en/2024/markupcurl -X POST "https://data.us.algolia.com/1/transformations/try" \
-H "x-algolia-application-id: $ALGOLIA_APP_ID" \
-H "x-algolia-api-key: $ALGOLIA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"code": "return { ...record, price: record.price_cents / 100 };",
"sampleRecord": { "objectID": "p1", "price_cents": 4900 }
}'
14d. CMS market share (Web Almanac 2024)
- 51% of all sites use a CMS (up from 46% in 2022)
- WordPress: 35.6% of CMS sites = 18.2% of all sites
- Wix: 2.8% / Squarespace: 1.5% / Joomla: 1.5% / Drupal: 1.2% / Shopify: ~1% / others: <1%
Plan impact: Detecting WordPress alone covers ~18% of the entire web. Adding Drupal, AEM, Shopify, Wix, Squarespace pushes coverage to ~30% via CMS fingerprint. This is more reliable than schema.org for these sites.
Per-CMS schema.org defaults:
- WordPress: minimal — relies on plugins (Yoast, RankMath) for structured data. Plugin adoption ~35% of WP sites.
- Shopify: ships Product + Organization + BreadcrumbList by default.
- Wix/Squarespace: proprietary auto-generation, opaque, often non-standard.
- AEM (Adobe): no defaults; structured data is bespoke per implementation.
- Drupal: minimal defaults; site-specific.
Source:
// tool: mcp__algolia__tryTransformation
{
"code": "return { ...record, price: record.price_cents / 100 };",
"sampleRecord": { "objectID": "p1", "price_cents": 4900 }
}
https://almanac.httparchive.org/en/2024/cmscurl -X POST "https://data.us.algolia.com/1/authentications" \
-H "x-algolia-application-id: $ALGOLIA_APP_ID" \
-H "x-algolia-api-key: $ALGOLIA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"type": "oauth",
"name": "Shopify OAuth",
"input": {
"url": "https://my-store.myshopify.com/admin/oauth/access_token",
"client_id": "REPLACE_ME",
"client_secret": "REPLACE_ME"
}
}'
14e. JS framework / SPA adoption (Web Almanac 2024)
- jQuery: 74% of pages (entrenched, mostly WordPress legacy)
- React: 10% (slight growth from 8% in 2023)
- All modern frameworks combined: ~20% of pages
Plan impact: ~80% of pages are server-rendered or static. Cheerio handles them. ~20% need JS execution. SPA detection should err on the side of "static-first, escalate to Playwright on signals" — wasting Playwright cycles on every page is expensive.
Source: <https://almanac.httparchive.org/en/2024/javascript>
14f. Cross-vertical site coverage validated (~59 sites across 13 verticals)
This plan was validated against an extensive cross-section of real sites during the planning session. Each site was probed for robots.txt, sitemap structure, JSON-LD, OpenGraph, CMS signature, WAF posture, and URL conventions.
| Vertical | Sites validated | WAF-block rate | JSON-LD coverage | §16 row |
|---|---|---|---|---|
| Enterprise B2B | Salesforce, Adobe, Oracle, HP, BMW, Mercedes | 6/6 | unverifiable (blocked) | 16c |
| CMS / generalist | TechCrunch, WordPress.org, Shopify, Drupal.org, Wikipedia, Guardian | 0/6 | 1/6 (Wikipedia partial) | 16a, 16b, 16d, 16h |
| Government | USA.gov, GOV.UK | 0/2 | 0/2 | 16b, 16j |
| Multi-brand corporates | LVMH, Diageo, Unilever, P&G | 2/4 | rare | 16k |
| Massive scale tech | Microsoft, AWS, Apple, Algolia, learn.microsoft.com | 0/5 | partial | 16l |
| SaaS B2B / API-first | commercetools, BigCommerce, OpenText | 0/3 | rare | 16m |
| Education / online learning | Coursera, Khan Academy, MIT OCW, edX | 0/4 | 3/4 (Course schema) | (sub-row of 16m) |
| SaaS dev tools | Stripe, Notion, Atlassian, Datadog | 0/4 | 1/4 (Datadog only) | (sub-row of 16m) |
| Healthcare | Mayo Clinic, WebMD, Cleveland Clinic | 1/3 | 0/3 | 16h-extended |
| News / media | Medium, NYT, BBC, Reuters | 3/4 | 1/4 (Medium NewsArticle) | 16a-extended |
| Community / social | Stack Overflow, Reddit, Hacker News | 2/3 | 0/3 | 16h-extended |
| Non-profit / docs | Mozilla, Adobe Helpx | 1/2 | 0/2 | 16h-extended |
| Manufacturing | 3M, Caterpillar, Siemens | 2/3 | 1/3 (Siemens) | 16c-extended |
| E-commerce retail | Walmart, Etsy, eBay, Wayfair, Best Buy | 5/5 | 0/5 (verifiable) | 16o |
| DTC retail commerce | Nike, Restoration Hardware, Walgreens, Dell, LL Bean, Oriental Trading, SKIMS, Havertys | 5/8 | 0/8 of accessible | 16o |
| Furniture vertical (subset) | Restoration Hardware, Havertys | 2/2 (full WAF) | unverifiable | 16o (furniture sub-schema in v2) |
Aggregate WAF rate: ~40% of sites tested fully WAF-block plain fetch from a Vercel-class datacenter IP. Higher concentrations in: enterprise B2B (100%), premium DTC retail (>50%), retail (Walmart/Etsy/Wayfair-class). Lower in: government (0%), open-source CMSes (0%), education with permissive Allow: / (MIT OCW), modern SaaS docs.
Aggregate JSON-LD usefulness for content classification: when content-class @types are needed (Article, Product, Course, MedicalCondition), real-world coverage is <25% across the verticals tested. Education (Course schema) is the single domain where JSON-LD is reliable enough to lead the cascade. Everywhere else: CMS-fingerprint + URL-pattern leads, JSON-LD is a confirmer/enricher.
Universal patterns (high reliability):
- robots.txt: present on 95%+
- Sitemap discoverable (via robots.txt or /sitemap.xml fallback): ~70% (lower than expected; many sites WAF-block sitemaps too)
- URL path conventions for content domain: ~95% (the universal floor for classification)
- CMS signature detectability when CMS is present: ~90%
14g. 14-site initial audit findings (planning session — round 1)
Sites successfully audited (CMS / generalist)
TechCrunch, WordPress.org, Shopify, Drupal.org, USA.gov, GOV.UK, Wikipedia, The Guardian.
Findings:
- 0 of 8 had JSON-LD on the listing/index pages tested.
- Wikipedia had partial JSON-LD (WebPage, Article, ImageObject) only on actual article pages.
- All 8 had robots.txt with at least one Sitemap directive.
- All 8 had a discoverable sitemap (variants: top-level urlset, sitemap-index with sub-sitemaps; sub-sitemap counts ranged from 1 to 1,450).
- Drupal-based sites (Drupal.org, USA.gov, GOV.UK partially) all enforced Crawl-delay: 10.
- WordPress sites (TechCrunch, WordPress.org) had /wp-content/, /wp-json/, wp-block-* classes. Nearly identical signatures.
- <article> tags appeared on roughly 1 in 8 sites (low). Date+author was always recoverable from text + visible page elements.
Sites blocked by WAF (enterprise B2B)
Salesforce, Adobe, Oracle, HP (partial), BMW, Mercedes-Benz.
Findings:
- Plain fetch from Vercel-class IPs returned 403 / timeout / CAPTCHA on most attempts.
- HP's homepage WAS reachable; revealed Adobe AEM signatures (/content/dam/, /digitnav/menu/).
- Conclusion: enterprise B2B requires Playwright stealth mode for the discovery+sample phases. The Algolia Crawler itself runs from a different IP range that many enterprise WAFs already allowlist for SEO — so the production crawler usually works once configured.
Plan impact: Playwright fallback moved from v2 to v1. The factory must detect WAF blocks early (repeated 403/timeout patterns) and surface the option.
14g. Detection cascade hit rate (synthesized from above)
For an arbitrary content page in 2026:
| Cumulative cascade through layer | Expected coverage |
|---|---|
| 1. CMS fingerprint | 51% |
| 1+2. CMS + URL pattern | ~95% (URL is universal floor) |
| 1+2+3. + JSON-LD when present | ~95% (URL already covers; JSON-LD enriches confidence) |
| 1+2+3+4. + OG | ~95% with refined confidence |
| 1+2+3+4+5+6. + microdata + date/author regex | ~98% |
| All layers + LLM fallback | 100% |
Key insight: URL pattern matching is the universal floor. CMS fingerprint is the most-reliable single signal. Schema.org is a confidence booster, not a foundation. The cascade reaches >95% useful coverage WITHOUT relying on JSON-LD.