Problem
There are effectively two sitemaps and both are broken: the static one a host would serve is localhost-poisoned and judge-free; the good dynamic one is unreachable per our own robots rules.
Findings
- The build regenerates
dist/sitemap.xmlwithhttp://localhost/...URLs (nobuild.domaininstx.config.ts), listing/jtest,/secret-marketing,/paywall— and zero judges. - The correct dynamic sitemap (
app/Actions/SitemapAction.ts:28— all judges/courthouses/reviews) lives at/api/sitemap.xmlwith an APP_URL-localhost fallback. public/robots.txt:23hardcodesSitemap: http://localhost:4000/api/sitemap.xmlwhilerobots.txt:12Disallows/api/— the advertised sitemap is inside a disallowed path.
Acceptance criteria
- Exactly one sitemap reachable at the site origin, URLs built from APP_URL (not localhost)
- Sitemap includes all judge profile URLs and excludes
/jtest,/secret-marketing,/paywall - robots.txt Sitemap line templated from APP_URL and not pointing into a Disallowed path
Split out from the SEO bundle of the 2026-06-10 production-readiness audit. Depends on: #46 (per-judge static pages must exist to be worth indexing).