レジデント準備完了 静的コンパニオン
kari_mikumao 研究室

Systems

Mirai Guideの内側:オフラインファーストのイベントコンパニオン

ログイン不要のPWA、2つのWorker、そしてデータについての1つの厳しい規則が、ファン運営のイベントガイドの信頼性を支えています。

  • mirai-guide
  • アーキテクチャ
  • cloudflare
  • pwa

Mirai Guideは、ボカロ系イベントのための三言語・オフラインファーストのコンパニオンです。会場グッズ、来場者による在庫・行列の報告、永続するローカルカート、マップ、ルート計画。

同時にこれは、個人のファンプロジェクトでもあります。それを、電波の届かないホールで、限られた時間しかない人たちが頼りにします。この組み合わせがずっと設計の中心にあって、このノートはそこから出てきた判断についてです。

2つのWorker、1つの境界

  • 来場者向けPWA、管理UI、HTTP APIは、Cloudflare Workers上のSvelteKitとTypeScriptのアプリケーションです。
  • Cloudflare Workflows上に建てた独立したパイプラインWorkerが、外部に触れるすべてを担います。承認済みソースの丁寧な取得、抽出、翻訳、メディアのキャッシュ、提案のステージング。
  • D1にはレビュー済みの構造、カタログ、ライブ状態、パスキー認証情報、来歴、競合、追記専用の監査履歴を保存します。プライベートR2バケットには、不変の公開バンドルと、承認済みソース由来のレビュー済み・コンテンツハッシュ付き商品画像を保存します。

来場者はログインしません。アプリはPWAとしてインストールされ、公開バンドルから会場内でもオフラインで動き続けます。認証があるのはオーナー・管理画面だけで、それもパスキーです。

バインディングデータ規則

いちばん大事にしている規則で、言うだけなら簡単です。

リポジトリ、マイグレーション、アプリケーションコード、テスト、ドキュメントには、イベントの事実が一切入りません。開催回の名前、会場、日程、ベンダー、ブース、グッズ、ソースURL。どれもです。D1は空の状態から始まります。

管理者が公開の発見用URLを設定します。抽出システムが証拠と確信度つきで構造を提案します。人間がその提案をレビューして、初めて行ができます。

これで買えるもの:

  • 名前も都市も会場レイアウトもブース番号体系も未知の将来のイベントを、同じシステムがそのまま支えられます。何もハードコードされていないからです。
  • IDは不透明で、分類キーは安全な表示フォールバックを持つ自由文字列です。コードがベンダー名を特別扱いすることはありません。
  • モデルの出力がそのまま公開されることはありません。すべての提案が人間の拒否権を通ります。

ここでの近道は分かりやすくて、今年の会場をハードコードして早く出し、あとで直す、というものです。でもその「あとで」は来ません。そして次の開催回は、誰も予想していないレイアウトでやってきます。

なぜこの形か

イベントコンパニオンが信頼を得る機会は一度きりです。

データ面をレビュー済み構造、不変の公開バンドル、明示された来場者報告に分けておけば、電波の届かない場所に立っている人にも、動くマップとカタログが残ります。そして目にしているものの中に、クローラーや言語モデルが直接書いたものは1つもありません。