NEAPTIDE / HREFLANG-2026-10-04
Observed on 4 October 2026. Research performed before article drafting.

Question
How should canonical, hreflang, sitemap and language navigation reflect page-specific translation availability? The study measures technical consistency, not Google indexing, ranking, traffic or AI citations.

Two separate evidence sets
1. Published Neaptide pages: /services/geo, /blog/multilingual-website-guide and /blog/b2b-catalog-seo in en, ru, fr, es, it and zh. The 18 URLs were fixed before collection. Two GET passes were planned: 36 attempts. One Spanish B2B-page request had a connection reset; that failed record is retained, followed by one separately recorded successful retry. Total: 37 attempts, 36 successful responses. No claim that the original pass was error-free.
2. A local controlled Next.js fixture: three page profiles (all six languages; en/ru/fr; English only), checked against all six locale paths. Both the deliberately faulty and corrected phase have 10 available and eight missing routes. Eighteen route/language combinations per phase, two HTTP passes: 72 observations. Fixture runtime: Next.js 15.5.22, React/React DOM 19.2.6, Node.js v25.2.1, production build. This does not identify the production site's framework version.

Registration
protocol.json fixes the question, URLs, availability matrix, fault, correction and checks. protocol.sha256 records its hash. pre-run-freeze.json records hashes of the protocol and fixture source before measuring the fixture. Source hashes are revalidated during analysis. An initial unsuccessful compilation, had one occurred, would not be a page observation. This fixture compiled successfully before collection.

Production checks
GET status, redirect chain/final URL, self-canonical, html lang, declared alternate URLs, self-reference/reciprocal language mapping, and matching sitemap entries. The 18 available pages each declared six language alternatives plus x-default, with English as the latter. Two successful responses per URL (including the separate retry) agreed on the measured fields. A browser DOM check on each URL matched the metadata. One language-switcher action per source URL followed a six-language cycle while preserving the route: 18 observed successful actions. This is not all 90 possible directed language changes across the three routes. Rendered headings and short text were inspected for language; not a full translation-quality audit.

Controlled fault and correction
The before phase deliberately builds metadata, sitemap and navigation from the site's six-locale list. Missing translations still return 404; no English fallback content is served under a missing language URL. The after phase uses the actual translation records for all three outputs. Published pages keep self-canonicals. Multilingual clusters include all their available translations, including themselves. The English-only profile omits hreflang and has no alternative-language navigation. Choosing English for x-default is specific to this fixture, not mandatory for all sites. The fixture includes both HTML and sitemap language annotations to check agreement, not because both are required by Google.

Counting rules
A bad hreflang edge is one source page's annotation targeting a measured non-200/missing page. Repeating the same target from three source pages counts as three edges. A bad switcher edge uses the same rule for a visible language link. A bad sitemap URL is one missing page listed as a loc entry. These denominators differ and must not be added together as a single page count. x-default annotations are included in total annotation counts but do not produce missing targets in this fixture.

Results
Before: 14 hreflang edges and 14 language-navigation edges target missing translations; eight missing URLs appear in the sitemap. After: zero in each category. All six-language control pages retain their coverage. The eight missing combinations remain 404 in both phases and carry noindex in the observed output. Their continued absence is expected, not a failed fix. Canonicals on all 10 published pages remain self-referential in each phase.
Every one of the 36 phase/route/language combinations was also opened in a browser. Canonical, hreflang, navigation and heading matched the measured HTML. Five representative clicks were tested: two deliberately bad links led to the expected 404 views; three valid links reached the intended localized page. For the English-only corrected page, the absence of alternative-language links was checked in the DOM.

Limits
The live sample is only three route families, not a whole-site audit. All work uses one researcher and a same-day snapshot. The fault is injected and does not establish defect prevalence in Next.js sites. There is no crawler identity claim: HTTP collection uses a disclosed research user agent, not Googlebot impersonation. No Search Console indexing evidence or search-performance claim is made. Direct HTTP/DOM consistency cannot prove that Google will choose a canonical or serve a language version. Static route generation and missing-route behavior are specific to this fixture; streaming/dynamic deployments must be checked separately.

Downloads and reproduction
results.json contains protocol, analysis and compact observed fields for both evidence sets, including the failed attempt and its retry.
hreflang-lab.zip contains the fixture, collector, registered protocol and original results. It excludes node_modules, .next, cookies, full production HTML and response headers.
Extract the ZIP. In fixture/, run npm install, npm run build, npm run start. Then from the extracted parent directory run python3 collect.py lab. Inspect lab-observations.json and the two /sitemaps/before and /sitemaps/after endpoints at http://127.0.0.1:8782. The collector uses Python's standard library. Keep the default origin/port when reproducing these commands, or update the protocol and LAB_ORIGIN consistently in a new study directory. Dependency versions are pinned at the top level; transitive packages are not supplied as a lockfile. Original browser checks are documented observations, not a claim that the HTTP collector reruns browser interactions.

Primary documentation checked on 4 October 2026
Google localized versions: https://developers.google.com/search/docs/specialty/international/localized-versions
Next.js 15 metadata: https://nextjs.org/docs/15/app/api-reference/functions/generate-metadata
Next.js 15 notFound: https://nextjs.org/docs/15/app/api-reference/functions/not-found
