ランダム短歌 — 非同期モード要件¶
- ステータス: 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[写真保存 既存機能]
参加者体験¶
- 招待 URL から参加 → ニックネーム
- テーマを見ながら、7日以内に好きなタイミングでカード入力 → 保存
- 「入力済み: 2/3 人」のような進捗を見る
- 締切後、誰かが合成 → 短歌が表示される
- (MVP)自分で URL を開き直す / LINE で URL 共有
- (将来)メールで「短歌ができました」+ 画像
ホスト体験¶
- ルーム作成時に 非同期モード を選択
- 締切日時を確認(作成 + 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.mjs(random-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日前など)
- 合成後もルームを数日残すか
- 非同期専用の「再合成」ルール