Services

Seo Regression Coverage 2026 06 17


SEO regression coverage review

Date: 2026-06-17

Scope: static review of root scripts/tasks, Turborepo tasks, Playwright suites, repo tooling, and existing SEO primitives for regression coverage around link health, sitemap/robots validation, metadata assertions, e2e coverage, and the narrow root runtime proof contract. No runtime behavior or tests were changed.

Current coverage#

  • Root package scripts expose Playwright link checks:
    • pnpm e2e:www and pnpm e2e:docs include e2e/*/tests/link-health.spec.ts and on-page-links.spec.ts where present.
    • pnpm e2e:academy includes e2e/academy/tests/link-health.spec.ts.
  • Mise has release-oriented link commands:
    • mise run check:links runs tools/scripts/check-broken-links.sh for local docs by default or production assistance.bg/www.assistance.bg when passed.
    • mise run check:links:prod runs existing production-mode Playwright link specs for www, docs, and academy.
    • mise run cf:build chains Cloudflare app builds with mise run check:links:prod.
  • tools/scripts/check-broken-links.sh supports docs-only checks, production origins, base paths, parallelism, and curl timeouts.

Playwright coverage#

  • Public-app e2e coverage exists for www, docs, academy, design-system, ui-library, and manager under e2e/.
  • Hydration smoke specs exist for the Next.js public apps.
  • Link health specs exist for www, docs, and academy; www and docs also have on-page link crawling specs.
  • Shared helpers centralize link route discovery, known broken link exceptions, web-server setup, hydration checks, and accessibility utilities.

Sitemap and robots generation#

  • apps/blog/app/robots.ts and apps/blog/app/sitemap.ts use App Router metadata routes.
  • apps/academy/app/robots.ts and apps/academy/app/sitemap.ts use App Router metadata routes.
  • apps/docs generates public/sitemap.xml in postbuild via pnpm run build:sitemap; it also ships a static public/robots.txt.
  • apps/www runs apps/www/internals/generate-sitemap.mjs in postbuild and ships static public/robots.txt/sitemap assets.

Metadata assertions#

  • There are app-level metadata implementations across public Next.js apps (metadata, generateMetadata, canonicals, OpenGraph, Twitter, robots/noindex), but no dedicated SEO metadata assertion test suite was found.
  • Existing tests cover behavior and rendering, not page-head invariants such as canonical URL, meta description, OpenGraph URL/image, Twitter card, or robots tags.

Runtime proof constraints#

  • pnpm verify:root-runtime / mise run verify:root-runtime is intentionally narrow and should not be treated as SEO, e2e, or deployment proof.
  • The current runtime proof validates root-level runtime assumptions only; SEO regression coverage must remain in dedicated scripts/tasks such as Playwright, sitemap checks, and link checks.

Gaps#

  1. No automated sitemap validation command verifies that generated sitemap XML is parseable, contains expected app roots, avoids localhost/preview URLs in production artifacts, and matches intended host/base-path conventions.
  2. No automated robots validation command verifies advertised sitemap URLs, disallow rules, or consistency between static robots files and App Router robots.ts outputs.
  3. No metadata regression tests assert canonical URL, title/description, OpenGraph/Twitter tags, or noindex placement for representative public routes.
  4. Link coverage is strongest for www, docs, and academy; there are no release link-check tasks for blog, design-system, or ui-library despite Cloudflare build/deploy tasks for them.
  5. cf:build depends on production-mode link specs only after building; there is no cheaper preflight that statically checks SEO artifact correctness before expensive builds/deploys.
  6. Known-broken link exceptions are centralized, but the review did not find an expiry/enforcement mechanism to keep exceptions from becoming permanent.

Add these as explicit tasks rather than expanding verify:root-runtime:

  1. mise run seo:metadata

    • Run Playwright against production-mode local servers for representative routes.
    • Assert <title>, meta[name="description"], link[rel="canonical"], meta[property="og:url"], meta[property="og:image"], meta[name="twitter:card"], and route-specific robots/noindex behavior.
    • Suggested initial route set: www /, www /pricing, docs /docs, docs /docs/guides, blog /blog, academy /academy.
  2. mise run seo:sitemaps

    • Build or inspect generated sitemap artifacts for www and docs plus App Router sitemap endpoints for blog and academy.
    • Validate XML parseability, absolute production URLs, expected sitemap index entries, and absence of localhost, *.pages.dev, or *.vercel.app in production artifacts.
  3. mise run seo:robots

    • Validate static and dynamic robots outputs.
    • Assert advertised sitemap URLs are reachable under the intended production host/base path and that preview/noindex controls are not accidentally applied to production hosts.
  4. mise run check:links:prod:blog, mise run check:links:prod:ds, and mise run check:links:prod:ui

    • Add Playwright link-health specs for the remaining Cloudflare-deployed public apps.
    • Include them in a broadened mise run check:links:prod only after the specs are stable.
  5. Known-broken link expiry check

    • Extend e2e/shared/known-broken-links.ts entries with owner/date/reason/expiry metadata or add a static check that fails on stale exceptions.

Narrow verification performed#

bash
1
mise tasks | rg 'check:links|test:e2e|e2e|cf:build|cf:publish|verify:root-runtime|test:smoke|build:sitemap|robots|sitemap'
bash
1
find e2e tools docs .docs -maxdepth 3 -type f | sort | head -200
bash
1
find apps -maxdepth 3 \( -name 'sitemap.*' -o -name 'robots.*' \) -print
bash
1
rg -n "generate-sitemap|sitemap|robots|metadata|generateMetadata|canonical|openGraph|twitter" \
2
package.json .mise.toml turbo.json e2e tools apps/{www,docs,blog,academy,design-system,ui-library,manager} -S