CASE STUDY / BETA / LOCALE + SEO
ONII Media
ユーザーが選んだ言語と記事本文・canonicalの整合性を、一つのlocale resolverへ集約。
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
- Editorial prototype
- Notion content integration
- Locale race identified
- Resolver and SEO redesign
- Beta — DNS verification pending