ponshu-room-lite/CommonSpecification.md

511 lines
14 KiB
Markdown
Raw Normal View History

# ぽんるーむ (Pon-Room) - 共通仕様書 v1.0
**作成日**: 2026-01-03
**対象**: AI開発エージェントCursor/Antigravity/Claude/Gemini
**目的**: すべての開発者・AIエージェントが参照する唯一のバイブル
---
## 📋 1. プロジェクト概要
### 1.1 アプリケーション情報
- **アプリ名**: ぽんるーむ (Pon-Room)
- **コンセプト**: 日本酒の「記録・解析・循環」を支えるAIプラットフォーム
- **バージョン**: 1.0.9+47
- **最終更新**: 2026-01-03
### 1.2 ターゲットユーザー
- **B2C (Consumer Mode)**: 一般ユーザー
- 日本酒体験の記録・診断・共有
- ゲーミフィケーション(ポイント・バッジ・レベル)
- 「酒向(しゅこう)カード」による自己表現
- **B2B (Business Mode)**: 飲食店
- 自店の日本酒メニュー作成PDF出力
- QRコード自動埋め込み
- インスタ投稿支援
### 1.3 アプリの循環ロジック
```
[飲食店] PDF + QRメニュー作成
[客] スキャンして詳細表示・ポイント獲得
[客] 自分の記録が貯まる → 酒向カード生成
[飲食店] 客の好みを理解してレコメンド
```
---
## 🛠️ 2. 技術スタック
### 2.1 フロントエンド
- **Framework**: Flutter 3.10.1
- **SDK**: Dart 3.10.1
- **対応プラットフォーム**: iOS, Android, Web
### 2.2 バックエンド・データベース
- **Database**: Cloud Firestore (Firebase)
- **Authentication**: Firebase Auth
- **Storage**: Firebase Storage (画像保存)
### 2.3 AI・機械学習
- **Local OCR**: Google ML Kit
- 用途: ラベルからのテキスト抽出
- メリット: 無料、高速、オフライン動作
- **LLM Analysis**: Gemini API
- モデル: `gemini-2.5-flash` / `gemini-3.0-flash`
- 用途: テキストの構造化、キャッチコピー生成
- 重要: 画像を直接送らず、OCRテキストのみ送信トークン節約
### 2.4 主要パッケージ
```yaml
dependencies:
# 画像・カメラ
image_picker: ^1.2.1
gal: ^2.3.0 # カメラロール保存
# PDF生成
pdf: ^3.10.0
printing: ^5.11.0
# QRコード
qr_flutter: ^4.1.0
mobile_scanner: ^3.5.0 # QRスキャン
# データベース
hive: ^2.2.3
hive_flutter: ^1.1.0
# AI
google_generative_ai: ^0.4.7
google_ml_kit: ^0.16.0 # OCR用
```
---
## 📊 3. 共通データ構造JSON Schema
### 3.1 基本方針
- **display_data**: カードUIで表示する最小限の情報シンプル維持
- **hidden_specs**: 詳細画面・PDF・分析で使用する情報
- **badges**: ゲーミフィケーション要素
- **gamification**: ポイント・レベル・診断結果
- **user_data**: ユーザーの主観的情報
- **metadata**: システム管理用
### 3.2 SakeItem完全JSON構造
```json
{
"display_data": {
"name": "獺祭 純米大吟醸 磨き二割三分",
"catch_phrase": "華やかな香りと洗練された味わい",
"image_path": "path/to/image.jpg",
"rating": 4.5
},
"hidden_specs": {
"brewery": "旭酒造株式会社",
"prefecture": "山口県",
"type": "純米大吟醸",
"alcohol_content": 16.0,
"polishing_ratio": 23,
"sake_meter_value": 4.0,
"rice_variety": "山田錦",
"yeast": "自社酵母",
"manufacturing_year_month": "2024.10",
"qr_code_url": "https://pon-room.app/sake/abc123"
},
"badges": {
"is_recommended": false,
"is_seasonal": false,
"season_tag": "春限定"
},
"gamification": {
"pon_points": 10,
"sake_mbti_type": "フルーティー・モダン型",
"rarity_level": "レア"
},
"user_data": {
"is_favorite": false,
"is_wishlist": false,
"tags": ["甘口", "フルーティー", "冷酒向き"],
"memo": "お祝い事にぴったり。冷やして飲むのがおすすめ。",
"drink_location": "○○レストラン",
"companion": "△△さん",
"purchase_location": "××酒販店",
"price": 5000
},
"metadata": {
"created_at": "2026-01-03T12:34:56Z",
"updated_at": "2026-01-03T12:34:56Z",
"app_type": "sake",
"app_mode": "consumer",
"version": "1.0",
"scanned_count": 0
}
}
```
---
## 🎨 4. UI構成ルール
### 4.1 タブ構成5タブ制
| タブ | Consumer Mode (B2C) | Business Mode (B2B) |
|------|---------------------|---------------------|
| **タブ1** | 日本酒カードリスト(自分の記録) | 日本酒カードリスト(店舗在庫) |
| **タブ2** | QRスキャン・AR情報表示 | PDFメニュー作成・QR埋め込み |
| **タブ3** | AIソムリエ・酒向カード診断 | インスタ投稿支援AI文章生成 |
| **タブ4** | 酒蔵マップ(聖地巡礼) | 店舗設定・在庫管理 |
| **タブ5** | マイページ(レベル・バッジ・設定) | アナリティクス(スキャン統計) |
### 4.2 カード表示ルール(重要)
**表示項目display_dataのみ:**
- 銘柄名 (`display_data.name`)
- 画像 (`display_data.image_path`)
- 評価 (`display_data.rating`) - 星表示
- バッジ (`badges`) - 店長推奨・季節限定アイコン
**非表示項目(詳細画面でのみ使用):**
- `hidden_specs` の全項目
- `user_data` の詳細情報
**理由:** シンプルなUIを維持し、挫折を防ぐ
### 4.3 詳細画面の表示項目
**全て表示:**
- `display_data` 全項目
- `hidden_specs` 全項目(スペック表として)
- `badges` (アイコン付き)
- `user_data` 全項目
### 4.4 PDF出力の表示項目
**主要項目:**
- `display_data.name`, `image_path`
- `hidden_specs` の以下:
- type, alcohol_content, polishing_ratio
- sake_meter_value, brewery, prefecture
- `badges` (アイコン付き)
- QRコード`hidden_specs.qr_code_url` から生成)
---
## 🤖 5. AI解析フローHybrid Analysis
### 5.1 撮影から保存まで
```
1. 撮影
├─ ImagePicker or Camera パッケージ
└─ カメラロール自動保存gal パッケージ使用)★重要
2. OCRテキスト抽出
├─ Google ML Kitローカル・無料
├─ 画像 → 全テキスト抽出
└─ 抽出テキストのみを次へ
3. AI解析構造化
├─ 抽出テキストを Gemini API へ送信
├─ プロンプト: 「JSONフォーマットで返して」
└─ 上記のJSON構造で回答を取得
4. 保存
├─ Hiveローカルに即座保存
└─ Firebaseクラウドに同期将来実装
```
### 5.2 AI解析プロンプト例
```
あなたは日本酒のラベル解析の専門家です。
以下のOCRテキストから、日本酒の情報を抽出してJSON形式で回答してください。
【OCRテキスト】
{ocrText}
【出力ルール】
1. display_data: 銘柄名と魅力的なキャッチコピー(あなたが生成)
2. hidden_specs: 詳細スペック(読み取れた範囲で)
3. 読み取れない項目はnullにする
4. JSONのみを返す```jsonなどのマークダウン記法は不要
5. キャッチコピーは20文字以内で簡潔に
【出力フォーマット】
{JSON構造をここに記載}
```
### 5.3 コスト最適化のポイント
**❌ NG: 画像を直接Geminiに送信**
- 高トークン消費
- エラー発生率が高い
**✅ OK: OCRテキストのみ送信**
- トークン消費70-90%削減
- 安定した動作
- 後から再解析が不要
---
## 🎮 6. ゲーミフィケーション機能
### 6.1 ポンポイント(仮称)
**獲得条件:**
- 日本酒を記録: +5pt
- QRスキャン: +10pt
- 酒蔵訪問: +30pt位置情報連動
- 評価・レビュー投稿: +3pt
**レベルシステム:**
```
0-49pt: 利き酒初心者
50-149pt: 日本酒愛好家
150-299pt: 酒豪
300-499pt: 利き酒師
500pt+: 酒マスター
```
### 6.2 酒向(しゅこう)カード
**概要:** MBTIライクな自己診断カード
**診断軸(レーダーチャート):**
1. 甘口 ←→ 辛口
2. 濃醇 ←→ 淡麗
3. フルーティー ←→ 米の旨味
4. 冷酒 ←→ 熱燗
**表示項目:**
- 診断タイプ(例: フルーティー・モダン型)
- レーダーチャート
- 好きな銘柄TOP3
- AIの一言コメント
**用途:**
- 店員に見せて好みを伝える
- SNSシェア画像として保存
---
## 📱 7. QR循環ロジック
### 7.1 BtoB: PDFメニュー作成時
```
1. 飲食店が店舗在庫を登録
2. PDFメニュー生成時、各銘柄にQRコード埋め込み
3. QRコード内容: https://pon-room.app/sake/{sakeId}
4. 印刷して店内に設置
```
### 7.2 BtoC: QRスキャン時
```
1. 客がアプリでQRスキャン
2. 銘柄詳細をAR風に表示オーバーレイ
3. 「記録する」ボタンで自分のリストに追加
4. ポンポイント+10pt獲得
5. 酒蔵リンクへの誘導
```
### 7.3 循環の価値
- **客**: スキャンする度にポイントが貯まる
- **店**: 客の興味データが蓄積(アナリティクス)
- **蔵元**: ECサイトへの誘導で売上向上
---
## 🎓 8. オンボーディング(使い方ガイド)
### 8.1 初回起動時
**4ステップガイド:**
1. ようこそ!日本酒の記録を始めよう
2. カメラで撮影するだけでAIが自動解析
3. お気に入りを記録して自分だけのコレクションを
4. 飲食店の方はBusinessモードへ切り替え可能
### 8.2 再表示機能
- 各画面右上の「?」アイコン
- タップでガイドを再表示
### 8.3 Businessモード専用ガイド
**3ステップモード切り替え時のみ表示:**
1. 店舗情報を設定しましょう
2. メニューを作成してPDF出力
3. QRコードで客とつながる
---
## 🚀 9. 開発優先順位Phase別
### Phase 0: 基盤整備 ✅
- [x] CommonSpecification.md 作成
- [ ] SakeItemモデルの拡張
### Phase 1: 安心の確保1-2時間
- [ ] カメラロール保存実装gal
- [ ] iOS/Android権限設定
- [ ] 撮影後の自動保存フロー
### Phase 2: BtoB機能完成4-6時間
- [ ] PDF + printing 実装
- [ ] モックアップ厳密再現
- [ ] QRコード埋め込み
- [ ] レイアウト定数化
### Phase 3: AI最適化3-4時間
- [ ] Google ML Kit 導入
- [ ] OCRテキスト抽出
- [ ] Gemini APIへのテキスト送信切り替え
### Phase 4: ゲーミフィケーション後回しOK
- [ ] ポンポイントシステム
- [ ] 酒向カード生成
- [ ] QRスキャン機能
---
## 📐 10. レイアウト定数PDF用
```dart
class PDFLayoutConstants {
// 余白
static const double pageMargin = 24.0;
static const double sectionSpacing = 20.0;
static const double itemSpacing = 12.0;
// フォントサイズ
static const double titleFontSize = 24.0;
static const double headingFontSize = 14.0;
static const double bodyFontSize = 11.0;
static const double labelFontSize = 9.0;
// 線の太さ
static const double borderWidthThin = 0.5;
static const double borderWidthMedium = 1.0;
static const double borderWidthThick = 2.0;
// 色posimaiカラー
static final PdfColor borderColor = PdfColor.fromHex('#E2E8F0');
static final PdfColor labelColor = PdfColor.fromHex('#64748B');
static final PdfColor accentColor = PdfColor.fromHex('#376495');
}
```
---
## 🔐 11. セキュリティ・プライバシー
### 11.1 データ保存場所
**✅ ローカル保存:**
- Hive DB: アプリ専用ディレクトリ
- 写真: カメラロール(ユーザー端末)
**✅ 外部送信(一時的、保存されない):**
- Gemini API: OCRテキストのみ画像は送らない
**❌ 外部送信なし:**
- 個人情報の無断クラウド保存
- サードパーティへのデータ販売
### 11.2 将来のFirebase連携
- ユーザーが明示的に「同期」を選択した場合のみ
- 画像はFirebase Storageへ
- テキストデータはFirestoreへ
---
## 🎯 12. 量産対応(ワイン・ビールアプリへの展開)
### 12.1 拡張方法
`metadata.app_type` を変更するだけで転用可能:
- `sake` → 日本酒
- `wine` → ワイン
- `beer` → クラフトビール
- `whisky` → ウイスキー
### 12.2 共通化できる機能
- 撮影・OCR・AI解析フロー
- ポイントシステム
- PDF出力・QR循環
- マイページ・設定
### 12.3 差分化が必要な箇所
- JSONの `hidden_specs` フィールド
- ワイン: ぶどう品種、産地、ヴィンテージ
- ビール: ホップ、モルト、IBU値
- キャッチコピーのトーン
---
## 📝 13. AIエージェントへの指示
### 13.1 開発時の鉄則
1. **この仕様書を最優先のルール(バイブル)として参照せよ**
2. **display_data と hidden_specs を明確に分離せよ**
3. **カードUIはシンプルに保ち、display_dataのみ使用せよ**
4. **挫折防止のため、段階的に実装せよPhase順守**
5. **モックアップがある場合は1px単位で厳密再現せよ**
### 13.2 コード生成時の注意
- null安全性を徹底
- エラーハンドリングを統一
- デバッグログを適切に配置
- コメントは日本語で簡潔に
### 13.3 質問・提案時のルール
- 仕様書と矛盾する提案をする場合は理由を明記
- 新機能追加時はPhaseを提案
- データ構造変更時はJSON例を提示
---
## 📞 14. サポート・連絡先
**プロジェクトオーナー**: posimai
**開発支援AI**: Claude (Anthropic), Gemini (Google AI), ChatGPT (OpenAI)
**バージョン管理**: Git (GitHub)
**CI/CD**: Vercel (Web), Firebase Hosting
---
## 🎉 15. 最後に
この仕様書は「挫折しない日本酒アプリ開発」のために、複数のAIの知恵を結集して作成されました。
**重要な心構え:**
- シンプルから始める
- データは豊富に持つが、表示は最小限に
- ユーザーが「楽しい」と感じる体験を最優先に
**Let's build the best sake app together! 🍶✨**
---
**End of CommonSpecification.md v1.0**