コンテンツにスキップ

ランダム短歌 — 非同期モード要件

  • ステータス: Phase 1 実装済み(2026-07)
  • 関連: random-tanka-ideas.md(アイデア元)、random-tanka-data.md(保存先)

コンセプト

同時に集まらなくても、数日かけてカードを書き、締切後に短歌ができるパーティ。

同期モード(通常・曲水の宴)とは 別モード として実装する。


合意事項(2026-07)

項目 決定
入力締切 7日(ルーム作成から)
合成タイミング 入力済み2人以上 なら合成可(締切前でもOK)。締切後も同様
最低人数 2人(ルームに2人以上、合成も2人以上の入力済みが必要)
合成操作 期限後は 誰でも合成可(同期系と同じ方針)
MVP の通知 メール(任意登録・合成/再合成時)。SMTP 未設定なら no-op
MVP 以降 メール(一斉送信・メルマガ的)→ 画像添付
LINE 画像添付 将来案 — MVP では見送り

フロー

flowchart LR
  A[ホスト: 非同期ルーム作成] --> B[招待URLを共有]
  B --> C[各自: 好きな時間にカード保存]
  C --> D{7日経過?}
  D -->|No| C
  D -->|Yes| E[入力済み2人以上?]
  E -->|Yes| F[誰かが合成]
  E -->|No| G[短歌なし / エラー表示]
  F --> H[結果をURLで閲覧]
  H --> I[写真保存 既存機能]

参加者体験

  1. 招待 URL から参加 → ニックネーム
  2. テーマを見ながら、7日以内に好きなタイミングでカード入力 → 保存
  3. 「入力済み: 2/3 人」のような進捗を見る
  4. 締切後、誰かが合成 → 短歌が表示される
  5. (MVP)自分で URL を開き直す / LINE で URL 共有
  6. (将来)メールで「短歌ができました」+ 画像

ホスト体験

  • ルーム作成時に 非同期モード を選択
  • 締切日時を確認(作成 + 7d)
  • 進捗を見守る
  • 締切後に合成(または全員入力済みなら早めに合成も検討 — Phase 2

同期モードとの違い

通常 / 曲水 非同期
TTL 24h 7d
締切 曲水のみ(分単位) 入力締切 7d
揃い方 同時在线 時間差 OK
ready 通常は意味あり 保存済み = 入力完了 で十分
ポーリング 3秒 30秒〜 でよい
通知 不要 MVP 不要 → メール Phase 2

データ設計(案)

-- rooms に追加
mode = 'async'
input_deadline_at TEXT   -- created_at + 7d
-- expires_at も 7d に合わせる(または composed 後 +α)

-- participants(任意・Phase 2)
email TEXT NULL        -- 通知先(任意登録)
submitted_at TEXT NULL -- 初回カード保存時

合成対象

  • mode = async かつ input_deadline_at 経過
  • participantHasWrittenCards が true の参加者のみ
  • 2人以上 かつ 57577 的に 1首以上 作れること

状態

  • status = input … 締切前・入力受付中
  • status = composed … 合成済み
  • 締切後も input のまま → カード編集ロック、合成可能

通知ロードマップ

MVP(Phase 1)— やる

  • mode = async、7d TTL / 締切
  • 進捗 UI(入力済み人数)
  • 締切後合成(2人以上入力済み)
  • 結果は Web + 既存 Canvas 写真保存
  • テスト: ASYNC_DEADLINE_MINUTES + scripts/test-async-flow.mjsrandom-tanka-testing.md
  • 退室ボタン(参加者リストから静かに抜ける)
  • 締切前の早期合成(入力済み2人以上)
  • メール通知(任意登録・合成/再合成)

やらない: LINE Bot、サーバー PNG

Phase 2 — メール(メルマガ型)

  • 参加者が 任意でメールアドレス を登録(PUT /api/rooms/:code/email
  • 「短歌ができました」 / 再合成 — SMTP 設定時に送信
  • 「○○さんが入力しました」(任意・うるさければ off)
  • 締切前リマインドメール

メルマガ的 = 1通のテンプレート + 参加者リスト BCC または個別送信。
ホスト向け一斉送信より 参加者各自への通知 が主。

Phase 3 — メール画像添付

  • サーバー側 PNG 生成(tanka-canvas.js の Node 移植)
  • メールに image/png 添付 or インライン CID

将来 — LINE

手段 現実性
LINE 共有ボタン(URL テキスト) ✅ 既にある
LINE に画像を「添付」して送る ❌ 公式 API ではユーザー代わりに送れない
LINE Notify / Messaging API △ Bot 要・友だち追加・開発コスト
ユーザーが自分で写真保存 → LINE 共有 ✅ MVP で可能

結論: 「LINE に画像添付」は ユーザー操作(保存 → 共有)Bot 事業 になり、MVP 向きではない。


実装タッチポイント(Phase 1)

変更
db.ts ROOM_MODE_ASYNC, TTL 7d, input_deadline_at
room.ts computeCanCompose, resolveComposeParticipants 分岐
compose/route.ts 締切・2人チェック
cards/route.ts 締切後ロック
page.tsx / app.js 作成モード、進捗、締切表示
random-tanka-data.md TTL 追記

未決定(Phase 2 以降でよい)

  • 全員入力完了 の早期合成を許すか
  • 締切前リマインドメール(3日前など)
  • 合成後もルームを数日残すか
  • 非同期専用の「再合成」ルール