要件定義書 — ランダム短歌 MVP¶
- バージョン: v0.1
- ステータス: 合意済み・MVP 実装対象
- 実装:
tanka-party/(Life OSwebapp/とは分離)
1. ゴール¶
同じ場所に集まった 2〜6人 が、スマホ/PC から同時参加し、各自が書いた 5音・7音フレーズのカード をランダムに組み合わせて 短歌(57577) を作るパーティ向け Web アプリ。
2. 確定要件¶
| ID | 項目 | 内容 |
|---|---|---|
| R-01 | 利用シーン | ルーム型・同期パーティ |
| R-02 | 参加人数 | 2〜6人 |
| R-03 | カード枚数 | 1人あたり 5音5枚 + 7音5枚(計10枚) |
| R-04 | 入力ルール | 音数は目安表示のみ。送信は止めない |
| R-05 | 音数の数え方 | 仮名ベース(拗音・促音・長音・撥音も1音)。ベストエフォート |
| R-06 | 短歌の数 | 参加人数と同数 |
| R-07 | カード再利用 | 1セッション中1回まで(重複なし) |
| R-08 | ルーム参加 | ホスト作成 → 4桁コード + URL 共有 → コード入力で参加 |
| R-09 | ニックネーム | 必須(8文字以内・ログイン不要) |
| R-10 | 進行 | 全員「準備OK」→ ホストが「合成する」 |
| R-11 | 作者表示 | なし(匿名) |
| R-12 | 結果表示 | 縦書き・1首ずつカード状 |
| R-13 | 結果保存 | サーバーに保存しない(コピー/画像保存のみ) |
| R-14 | ルーム寿命 | 24時間で自動削除 |
| R-15 | 同期 | 3秒間隔ポーリング |
| R-16 | 名称 | ランダム短歌(random-tanka) |
3. 非ゴール(MVP)¶
- アカウント登録・ログイン
- 結果のサーバー保存・履歴
- 作者名の表示
- 厳密な音数バリデーション(送信ブロック)
- SNS 共有ボタン専用 UI
- Life OS
webapp/との統合 - WebSocket リアルタイム同期
4. 画面フロー¶
flowchart LR
A[トップ] --> B[ルーム作成 / 参加]
B --> C[ロビー]
C --> D[カード入力]
D --> E[準備OK待ち]
E --> F[ホスト: 合成]
F --> G[結果表示]
4.1 トップ¶
- 「ルームを作る」(ニックネーム入力)
- 「ルームに参加」(4桁コード + ニックネーム)
4.2 ロビー¶
- 参加者一覧(ニックネーム)
- 参加人数 2〜6 の表示
- 2人未満: 合成不可(待機メッセージ)
- 全員入力・準備OK後: ホストのみ「合成する」ボタン表示
4.3 カード入力¶
- 5音枠 × 5、7音枠 × 5 の入力欄
- 各欄に音数目安(例: 目安 5 音)
- 「準備OK」トグル(カード保存 + ready 状態)
4.4 結果¶
- 参加人数分の短歌を縦書きカード表示
- テキストコピー
- 画像保存(各首または全体)
5. 合成ロジック¶
- 全参加者の 5音・7音カードをプール化(空文字は除外)
- 参加人数を N、生成首数も N
- N 首ぶん、順に:
- 5音プールから2枚、7音プールから3枚を 重複なし でランダム抽出
- 57577 の順で1首構成
- プール不足時: 利用可能な枚数で可能な限り生成(MVP では 2人×各5枚で十分)
6. API(案)¶
| メソッド | パス | 説明 |
|---|---|---|
| POST | /api/rooms |
ルーム作成 |
| POST | /api/rooms/{code}/join |
参加 |
| GET | /api/rooms/{code} |
状態取得(ポーリング) |
| PUT | /api/rooms/{code}/cards |
カード提出 |
| POST | /api/rooms/{code}/ready |
準備OKトグル |
| POST | /api/rooms/{code}/compose |
合成(ホストのみ) |
認証: 参加者 ID + ホストトークンをクライアント保持(localStorage)。
7. データモデル(案)¶
rooms¶
id,code(4桁),host_token,status,tanka_json,created_at,expires_at
participants¶
id,room_id,nickname,is_host,ready,cards_five(JSON),cards_seven(JSON)
8. 技術構成¶
tanka-party/
README.md
package.json
vercel.json
schema.sql
src/
app/ # Next.js UI + API Routes
lib/ # DB・音数・合成ロジック
public/
app.js # クライアント UI ロジック
scripts/
migrate-turso.mjs
- フロント + API: Next.js 16(Vercel ネイティブ)
- DB: Turso(libSQL) — 本番は webapp と同じ Turso を共可。ローカルは
data/local.db - テーブルは初回 API 時に
initDb()で自動作成 - 起動(ローカル):
cd tanka-party && npm install && npm run dev - デプロイ: Vercel で Root Directory =
tanka-party
9. 受け入れ条件¶
- 2人が同じルームに参加し、各10枚入力できる
- 全員準備OK後、ホストが合成でき、2首表示される
- 同じカードが複数首に出ない
- 結果をテキストコピーできる
- ルームコードで参加できる
- 音数目安が入力中に更新される(送信は常に可能)