CASE STUDY / BETA / LOCALE + SEO

ONII Media

ユーザーが選んだ言語と記事本文・canonicalの整合性を、一つのlocale resolverへ集約。

Beta16 / 16 tests PASSProduction domain unresolved

Problem

保存済みlocaleと非同期region resolverの結果が競合し、選択言語と記事本文が一致しない可能性がありました。

Requirements

明示的なユーザー選択を優先し、URL・保存値・browser・region・defaultを一貫した順序で解決すること。

Constraints

記事URL、既存JSON、Notion公開フローとの互換性を保ち、秘密情報をfrontendへ出さないこと。

Architecture

共通locale resolverをHomeと記事表示から参照し、build時にcanonical・Article JSON-LD・sitemapを生成します。

Implementation

resolverと表示処理を統合し、locale別metadata、内部リンク、mobile overflow、accessibility guardをテスト対象へ追加しました。

Failed Approach

stored localeを先に確定しつつ、後からregion結果で表示を更新する方式は、非同期順序により表示とURLを分離させます。

Root Cause

locale決定責務が複数の非同期処理へ分散し、唯一の優先順位が存在しなかったこと。

Fix

8516ef1でlocale resolverとeditorial表示、SEO生成を再構成しました。

Testing

Node test runnerでcontent、approval gate、locale、SEO、mobile、accessibility、production URL管理の16件を実行。

Evidence

  • Tests16 / 16 PASS
  • Git8516ef1
  • SecretsNotion payload exposure test PASS

Result

locale決定とSEO入力を共通化し、テストは合格。設定ドメインがDNS解決できないためProductionとは扱いません。

Known Limitations

Production DNSと実ブラウザ確認が未完了。実記事公開にはNotion Secretsと人による承認が必要です。

Lessons Learned

localeは表示後に補正する値ではなく、URL・content・metadataを生成する前に一度だけ決定する状態です。

AI Collaboration

編集方針・承認基準・QA判断はKoshi、実装支援とテスト整理はAI coding tools。公開可否はProduction証拠に基づき人が判断します。

Timeline

  1. Editorial prototype
  2. Notion content integration
  3. Locale race identified
  4. Resolver and SEO redesign
  5. Beta — DNS verification pending