コンテンツにスキップ

要件定義書 — ランダム短歌 MVP

  • バージョン: v0.1
  • ステータス: 合意済み・MVP 実装対象
  • 実装: tanka-party/(Life OS webapp/ とは分離)

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. 合成ロジック

  1. 全参加者の 5音・7音カードをプール化(空文字は除外)
  2. 参加人数を N、生成首数も N
  3. N 首ぶん、順に:
  4. 5音プールから2枚、7音プールから3枚を 重複なし でランダム抽出
  5. 57577 の順で1首構成
  6. プール不足時: 利用可能な枚数で可能な限り生成(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首表示される
  • 同じカードが複数首に出ない
  • 結果をテキストコピーできる
  • ルームコードで参加できる
  • 音数目安が入力中に更新される(送信は常に可能)