NEAPTIDE — Next.js sitemap diagnostic experiment
Observed 12 October 2026. Study LAB-SITEMAP-2026-10-12.

Question: which URL failed — a sitemap endpoint, its upstream data source, or a listed page? Did controlled dev and local production results differ?

Design: 4 cases, 7 variants, 2 environments, 2 rounds. 28 sitemap responses, 36 listed-page responses and 2 source preflight responses: 66 collector responses total. These are repeated observations, not 66 unique URLs. The missing source and retired product are intentional synthetic faults. No real client catalog was used.

Next.js 15.5.22, React/React DOM 19.2.6, Node v25.2.1, Python 3.9.6. Clean npm ci --ignore-scripts in an isolated temporary directory. next dev on 8801; next build followed by next start on 8802. Separate build directories and explicit local SITE_ORIGIN. Controlled two-record source on 8800. Full package lock and source hashes accompany the fixture.

For every sitemap request we saved status, headers, full body and SHA256; parsed XML and checked the urlset root namespace; read every loc and requested it only if it used the measured localhost origin. Maximum two loc entries; no automatic redirect following. XML checks do not constitute full XSD validation. A 200 listed response establishes availability, not full indexability.

Results in both environments and rounds:
S1 /sitemap.xml: 200, urlset, two loc entries, listed statuses 200/200.
S2 missing source: source 404, sitemap 500. Corrected source path: sitemap 200, two entries, 200/200. Our checked fetch explicitly throws for non-OK responses; 404-to-500 is not a universal framework mapping.
S3 incorrect /sitemaps/catalog.xml: 404. Actual /catalog/sitemap.xml route: 200, two entries, 200/200. Only the requested path changes.
S4 stale record: sitemap 200, two entries, 200/404. Filter published records: sitemap 200, one entry, 200. The removed product is not redirected or replaced.

The two rounds and dev/production path/status signatures matched. No production-only failure was observed. Different localhost origins are deliberate. Missing loc counts are null because no sitemap urlset was parsed, not zero valid entries.

Raw server logs preserve the expected checked-fetch error. Production logs also contain Next.js NoFallbackError for the product excluded by dynamicParams=false; the actual HTTP responses for that product were 404. Logs may contain internal framework handling beyond the bounded collector requests. Two browser screenshots supplement the HTTP evidence; they are not extra collector rows.

Limits: artificial faults, small fixture, local production only. No Vercel/CDN/proxy, live CMS/database, credentials, cache invalidation, sharded generateSitemaps, middleware or rewrites tested. The historical GitHub issue 72808 used a different RC/Windows/Prisma environment and was not reproduced. No Google ingestion, indexing, rankings, citations, traffic or conversion measured. The fixture is noindex/nofollow.

Reproduce: see README.txt in reproduction.zip. evidence.zip contains primary bodies, per-request records and server/build logs. results.json contains the analysis and structured primary observations. A replay verifies the downloaded collector against the still-running fixture; it is reported separately from the 66 primary responses.

References (checked 12 October 2026):
https://nextjs.org/docs/app/api-reference/file-conventions/metadata/sitemap
https://developers.google.com/search/docs/crawling-indexing/sitemaps/build-sitemap
https://github.com/vercel/next.js/issues/72808
