Ponshu Developer
073e55cc51
chore: update download page to v1.0.49
2026-04-23 22:32:46 +09:00
Ponshu Developer
856e349848
fix(ai): フォールバックモデルをgemini-2.0-flash(廃止)→gemini-2.5-flash-liteに変更
...
gemini-2.0-flashはdeprecated済みで、primary(gemini-2.5-flash)が3回失敗した際に
廃止済みモデルへ落ちて確実にエラーになっていた。フォールバックを現役の
gemini-2.5-flash-liteに変更することで「解析に失敗しました」を解消する。
また、エラーメッセージにHTTPステータスコード等の短い補足を追加し、
次回の障害診断を容易にする(例: [404] [key?] [timeout])。
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 22:25:12 +09:00
Ponshu Developer
778d2a725a
fix(ai): 2段階解析のバグ2件修正
...
- Stage1でname/brandが両方nullの場合は無意味なStage2をスキップして1段階フォールバック
- nameJson/brandJsonをjsonEncode()でエスケープ(特殊文字含む銘柄名でのプロンプト破壊を防止)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 17:05:55 +09:00
Ponshu Developer
bcba78a533
feat(ai): Gemini 2段階解析実装(OCR→フル解析)でhallucination低減
...
Stage1でOCR専念(name/brand/prefecture確定)、Stage2で確定済み制約を
プロンプトに埋め込み残フィールドを推定する2段階フロー。
東魁→東魁盛のような銘柄補完hallucination緩和が目的。
- 直接APIモード(consumer APK)のみ2段階。プロキシ/キャッシュは従来通り。
- Stage1失敗時は1段階フォールバック(堅牢性維持)
- AnalyzingDialog: stageNotifier対応・ステップ1/2のメッセージ切り替え表示
- APIコール数は実質2倍(1日20回→実質10回相当)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 16:37:57 +09:00
Ponshu Developer
582553ccfa
fix(ai): 再解析を専用プロンプト+temperature=0.3に変更(東魁hallucination対策)
...
- reanalyzeSakeLabel() を新設: 前回のname/brandを渡し「本当に正しいか?」と問い直す
- 通常解析(temperature=0)と再解析(temperature=0.3)を分離
→ 同じ画像で毎回同じ誤答を返す問題を解消
- _callDirectApi に temperature パラメータを追加
2026-04-23 13:07:55 +09:00
Ponshu Developer
ab18b544c2
security: ライセンスキーを flutter_secure_storage へ移行、Pro UI ちらつき修正
...
- SharedPreferences のライセンスキーを FlutterSecureStorage(Android 暗号化)に移行
- 既存ユーザー向け一回限りのマイグレーション処理を追加(ponshu_license_migrated_v1 フラグ)
- LicenseService.getCachedStatusOnly() を追加(ネットワーク不要の即時キャッシュ返却)
- licenseStatusProvider を FutureProvider から AsyncNotifier に変換
- main() でキャッシュを事前ロードし licenseInitialStatusProvider に渡すことで
起動時の loading → false → pro のちらつきを根本解消
- バックグラウンドでサーバー検証を実行し、差異があれば状態を更新
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 10:23:18 +09:00
Ponshu Developer
1bf59e02cc
fix(stability): エラーハンドリング強化・クラッシュ防止 (v1.0.45)
...
- backup_service: 復元ループを per-item try-catch に変更
一件のJSONパース失敗でも他のアイテムが正常に復元されるよう修正
rating/markup/score の num→double キャスト安全化も同時適用
- camera_analysis_mixin: cast<String>() を whereType<String>() に変更
旧Hiveデータや型不一致でも新規登録がクラッシュしなくなる
- add_set_item_dialog: 空catchブロックにSnackBar通知を追加
画像選択失敗時にユーザーへフィードバックを表示するよう修正
- Image.file() errorBuilder を6ファイルに追加
sake_3d_carousel / sake_3d_carousel_with_reason / sake_search_delegate /
sake_detail_sliver_app_bar (×2) / sake_photo_edit_modal /
sakenowa_ranking_section — 画像ファイルが削除済みでも黒画面/クラッシュなし
- gemini_service: Device ID の debugPrint を kDebugMode ガードに変更
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 07:31:21 +09:00
Ponshu Developer
0fb4f6ea8b
fix(ai): ハルシネーション防止を一般化・N文字ルール追加・6銘柄例示
...
- systemInstruction をOCR専門システムとして再定義(東魁限定から一般化)
- 「ラベルにN文字なら必ずN文字のみ出力」ルールを明示化
- 東魁/男山/白鹿/久保田/白鶴/松竹梅の6銘柄例を追加
- 出力前セルフチェック手順をプロンプトに追加
- menu_pricing_screen: SharedPreferences を async/await+try-catch に修正
- version: 1.0.43+50 → 1.0.44+51
- web: eiji/maita 向け consumer APK (v1.0.44) を配置・ダウンロードページ更新
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 00:26:13 +09:00
Ponshu Developer
1a84163654
fix: use_build_context_synchronously 解消
...
_reanalyze で nav / messenger を async gap 前にキャプチャするよう移動。
showDialog の context 引数を ignore 対象行に統合。
dart analyze: No issues found
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-19 08:20:42 +09:00
Ponshu Developer
2e770ff98d
refactor: ハードコード色をAppColorsセマンティックカラーに置換
...
- pending_analysis_banner: Colors.orange.* → appColors.warning(グラデーション・影・バッジ)
- activity_stats: Colors.orange → appColors.warning(残回数少ない警告色・テキスト)
- scan_screen: Colors.grey → appColors.textTertiary(蔵元/産地テキスト)
- sake_no_match_state: Colors.grey[400/600] → appColors.textTertiary(空状態アイコン・テキスト)
- camera_screen: Colors.greenAccent → appColors.success(解析開始ボタン)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-19 08:18:48 +09:00
Ponshu Developer
9fba57621a
fix: quotaLockout Provider化・色トークン整備・依存バージョン固定
...
- quotaLockoutProvider (NotifierProvider) を新規作成し、カメラ・詳細画面で共有
- camera_analysis_mixin: quotaLockoutTime フィールドを削除、429時にProviderへ設定
- camera_screen: ref.watch(quotaLockoutProvider) でシャッターボタンUI更新
- sake_detail_screen: _quotaLockoutTime フィールドを削除、Providerに移行
- 画面遷移後もロックアウト状態が保持されるP1バグを解消
- camera_screen: Colors.red/grey → appColors.error/textTertiary に置換
- camera_screen: ギャラリー保存SnackBarから例外文字列 $e を除去
- camera_screen: SnackBarAction textColor Colors.yellow → appColors.brandAccent
- pubspec.yaml: flutter_riverpod ^3.1.0, riverpod_annotation 3.0.0-dev.3,
riverpod_generator 3.0.0-dev.11 を固定(バージョン未固定による意図しないアップグレードを防止)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-18 14:18:27 +09:00
Ponshu Developer
dd9b814174
refactor: TextEditingControllerリーク解消・エラー正規化・デザイントークン整備
...
- sake_detail_screen: _showTagEditDialog/TextEditDialog/BreweryEditDialog に
try/finally + controller.dispose() を追加(メモリリーク修正)
- sake_detail_screen: State フィールドを build() より前に移動
- 生例外の SnackBar 露出を人間可読メッセージに正規化(6ファイル・10箇所)
- camera_analysis_mixin: Colors.orange を appColors.warning に置換、
ガミフィケーション色を brandAccent/success/textTertiary に統一
- sake_detail_screen: ハードコード hex 色グラデーションをトークン化
- scan_screen / pdf_preview_screen / add_set_item_dialog: 絵文字 debugPrint を除去
- sake_basic_info_section: unnecessary_non_null_assertion (warning) を解消
- license_service: revoked 永続キャッシュの意図をコメントで明確化
- dart analyze: warning 0 / error 0
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-17 23:48:32 +09:00
Ponshu Developer
5d8689b7ee
merge: claude/sync-cursor-history-cSlsP — SakeItem setter廃止 + セマンティックカラー置換
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-17 13:09:56 +09:00
Claude
a62bcd1d11
refactor: ハードコード色をAppColorsセマンティックカラーに置換
...
意図的な箇所(カメラUI・AppBar白テキスト・ハート色・Proバッジ等)はKEEP。
以下のUIロジックに影響しない7ファイルのみ変更:
- Colors.grey.shade400/[400] → appColors.iconSubtle (アイコン、無効状態)
- Colors.grey.shade300 → appColors.divider (プレースホルダー背景)
- Colors.grey → appColors.textSecondary / iconSubtle / divider (文脈別)
- Colors.grey[200] → appColors.surfaceSubtle (プログレスバー背景)
- Colors.orange → appColors.warning (警告スナックバー)
- Colors.green / Colors.red → appColors.success / error (完了・失敗スナックバー)
_createBackup()にappColorsをasync前にキャプチャするFlutterベストプラクティスを適用。
コメント化されていたデッドコメントも同時削除。
https://claude.ai/code/session_01DWQpnqrQWwxVKKWSL9kDPp
2026-04-16 23:50:39 +00:00
Claude
8ebd233305
refactor: SakeItemのdisplayData setter危険性を排除し、テストを追加
...
- SakeItem.applyUpdates()を追加(displayData/hiddenSpecsを1回のsave()でアトミックに更新)
- displayData/hiddenSpecs setterに@Deprecatedを付与(save()忘れによるデータ消失防止)
- sakenowa_auto_matching_service.dartをapplyUpdates()に移行(setterの直接使用を撲滅)
- SakeAnalysisResult.fromJson()のユニットテストを新規追加(tasteStatsクランプ・欠損補完等)
- SakeItem.ensureMigrated()のユニットテストを追加
https://claude.ai/code/session_01DWQpnqrQWwxVKKWSL9kDPp
2026-04-16 23:40:48 +00:00
Ponshu Developer
cc5175ebae
refactor: ExposureSliderPainter を別ファイルに切り出し
...
camera_screen.dart の末尾にあった _ExposureSliderPainter (60行) を
lib/screens/camera_exposure_painter.dart に分離。
動作変更なし。718行 → 659行。
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-16 21:08:30 +09:00
Ponshu Developer
ac2a54d07a
feat: AI使用回数トラッキング + クォータ上限時ドラフト保存
...
- ApiUsageService: SharedPreferences で Gemini 日次使用回数を追跡
- UTC 08:00(=日本時間 17:00)でリセット
- 上限 20回/日(プロジェクトあたりの無料枠)
- DraftReason enum: offline / quotaLimit / congestion を区別
- camera_analysis_mixin: 解析前にクォータを事前チェック
- 上限到達時は Draft 保存してカメラを閉じる(写真は失われない)
- 429 エラー時も同様に Draft 保存(従来はエラー表示のみで写真消失)
- API 呼び出し成功時(キャッシュ除く)にカウントアップ
- pending_analysis_screen: ドラフト理由を各アイテムに表示
- クォータ: リセット時刻つきの警告(オレンジ)
- 混雑 / オフライン: 理由別メッセージ
- ActivityStats: AI 使用状況 bento カードを追加
- 今日のAI解析 X / 20回 + プログレスバー
- 残り5回以下でオレンジ、上限到達で赤
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-16 17:58:00 +09:00
Ponshu Developer
68723a884e
feat: 記録日時を一覧カードと詳細画面に表示
...
- sake_list_item: カード末尾に相対日付を追加
今日 / 昨日 / N日前 / M/D / YYYY/M/D
- sake_basic_info_section: 蔵元行直下にカレンダーアイコン + 「YYYY年M月D日に記録」を追加
セット商品は非表示
- metadata.createdAt(非null保証)を使用、追加フィールド不要
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-16 14:01:17 +09:00
Ponshu Developer
aa933cf1e3
refactor: P2/P3-Step1 — camera_screen Mixin分離 + license storeURL修正
...
P2:
- license_screen.dart: storeUrl を store.posimai.soar-enrich.com に統一(TODO解消)
P3 Step1:
- camera_analysis_mixin.dart 新規作成: analyzeImages() + _performSakenowaMatching()
を CameraAnalysisMixin<T extends ConsumerStatefulWidget> on ConsumerState<T> に切り出し
- camera_screen.dart: 1031行 → 718行(-313行)
不要なimport 10個削除、Mixin適用、フィールド/メソッド移動
Note: Dart ライブラリプライベート制約のため Mixin の公開 API は
capturedImages / quotaLockoutTime / analyzeImages(アンダースコアなし)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-16 13:20:53 +09:00
Ponshu Developer
e82f66e44e
fix: prevent EXP farming on cache hits + fix tasteStats validation
...
- SakeAnalysisResult.isFromCache flag added (not serialized to JSON)
- Both cache-hit paths return result.asCached() to signal caller
- camera_screen: EXP +10 only awarded on fresh API calls, not cache hits
- camera_screen: show '解析済みの結果を使用(経験値なし)' on cache hit
- camera_screen: clear _capturedImages after successful analysis
- camera_screen: catch(_) -> catch(e) with debugPrint logging
- SakeAnalysisResult.fromJson: auto-fill missing tasteStats keys with 3,
clamp all values to 1-5 range to prevent broken charts
- Bump version 1.0.37+44 -> 1.0.38+45
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-16 10:46:42 +09:00
Ponshu Developer
3c3458ffb8
fix: restore detail spec inference while keeping name/brand/prefecture OCR-strict
...
- name, brand, prefecture: still OCR-strict (no completion/inference)
- alcoholContent, polishingRatio, tasteStats etc: restored from label + sake knowledge
- Overly strict 'no knowledge at all' rule was causing all detail specs to return null
- Sync fallback prompt with same policy
- Bump version 1.0.36+43 -> 1.0.37+44
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-15 15:52:50 +09:00
Ponshu Developer
3643ab7690
fix: replace sommelier role with OCR system role to prevent brand name hallucination
...
- Rewrote prompt: 'ソムリエ' role -> pure OCR system role
- Explicit prohibition on brand name completion/correction
(e.g. label shows 東魁 -> output 東魁, never 東魁盛)
- prefecture: output null if not written on label; inference from brand knowledge forbidden
- tasteStats: default to mid-value 3 instead of 'reasonable estimate' (was encouraging hallucination)
- Added concrete examples for white-deer, kubota, tokai cases
- Bumped version 1.0.35+42 -> 1.0.36+43
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-15 13:53:47 +09:00
Ponshu Developer
23ba95d326
fix: restore badgeColor null-assert (dart analyze false positive)
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-15 13:37:25 +09:00
Ponshu Developer
69b446ee17
fix: address code review findings - crash fixes, proxy OCR accuracy, lint cleanup
...
- tools/proxy/server.js: add systemInstruction + temperature 0 (fixes brand name hallucination e.g. Tokai->Tokaisou)
- gemini_service.dart: add cache read/write to proxy path (was missing, cache was dead code in production)
- camera_screen.dart: guard cameras.first crash when no camera available, add mounted checks in gallery loop
- sake_detail_screen.dart: remove unused gemini_service import, add ignore comment for showDialog context lint
- sake_basic_info_section.dart: remove redundant null-assert operators flagged by dart analyze
- dev_menu_screen.dart: remove unused gemini_service import
- 6 service files: remove emoji from log strings (project rule compliance, 60+ instances)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-15 13:30:00 +09:00
Ponshu Developer
b3e1f5d0a3
chore: Phase 1 code quality improvements - POSIMAI_BASE_URL explicit, no emoji in logs, model comment update
...
Made-with: Cursor
2026-04-12 13:23:52 +09:00
Ponshu Developer
0caf370302
security: remove internal Tailscale IP from APK binary (v1.0.34)
...
secrets.dart: change AI_PROXY_URL defaultValue from 'http://100.76.7.3:8080 '
to empty string. Consumer APKs use useProxy=false and never reach this code
path, so there is zero functional impact. Internal network topology is no
longer embedded in distributed binaries.
Made-with: Cursor
2026-04-12 11:47:35 +09:00
Ponshu Developer
2890b6cb6f
refactor: replace disk cache with in-memory session cache (v1.0.33)
...
Analysis cache redesign:
- Remove Hive persistence from AnalysisCacheService entirely
- Use Map<String, SakeAnalysisResult> in-memory instead of Hive boxes
- Cache now lives only for the duration of an app session; restart always
produces a fresh analysis — no stale misidentifications can persist
- Remove Hive init(), TTL/cleanupExpired(), getCachedByBrand() dead code
- API surface unchanged: callers (gemini_service, dev_menu) need no edits
- main.dart: delete legacy Hive boxes (analysis_cache_v1, brand_index_v1)
from disk on startup for existing users
- dev_menu_screen: update cache description text to reflect new behavior
Rationale:
- Camera captures always produce unique files -> cache hit rate was ~0%
- Each user supplies their own Gemini API key -> no shared cost benefit
- Persistent wrong results (e.g. misrecognized brand names) could survive
up to 30 days under the old design
- Different sake editions photographed separately have different hashes
and were never affected by the cache in the first place
Made-with: Cursor
2026-04-12 08:13:18 +09:00
Ponshu Developer
3d934deb56
fix: address remaining code audit findings and bump to v1.0.32
...
- migration_service: runMigration() now returns bool; main.dart only
advances migration_version when migration succeeds
- sakenowa_service: add 30s timeout to all 6 http.get calls
- gemini_service: add 60s timeout to Direct API generateContent call
- gemini_service: guard response.body error log with kDebugMode
- Remove emoji from debugPrint in core service/screen files
(gemini_service, analysis_cache_service, network_service,
draft_service, camera_screen)
Made-with: Cursor
2026-04-12 07:25:24 +09:00
Ponshu Developer
c8ffe2626f
refactor: apply critical code review fixes
...
- draft_service: GeminiService is now passed as a required parameter
to analyzeDraft/analyzeAllDrafts instead of being directly instantiated,
ensuring consistent Riverpod-managed injection
- gemini_provider: correct misleading comment (rate limiting is due to
static field, not Provider; Provider enables future safe refactoring)
- analysis_cache_service: cleanupExpired now also removes orphaned brand
index entries from _brandIndexBox after deleting expired _box entries
- analysis_cache_service: keysToDelete type corrected from List<dynamic>
to List<String>, removing unnecessary as String cast
- analysis_cache_service: _normalizeBrandName comment clarified to note
that .toLowerCase() only affects ASCII characters, not Japanese text
- camera_screen: add explicit ignore comment with rationale for
showDialog after async gap (mounted check immediately precedes it)
- camera_screen: remove leaked Cursor instruction comment from line 96
Made-with: Cursor
2026-04-12 00:24:57 +09:00
Ponshu Developer
94f7ee20ea
refactor: code quality improvements based on critical review
...
Made-with: Cursor
2026-04-12 00:09:09 +09:00
Ponshu Developer
cd57171670
fix: strengthen AI label recognition prompt and repo cleanup
...
Made-with: Cursor
2026-04-11 15:46:44 +09:00
Ponshu Developer
f8ceb0bf02
fix: ソムリエ画面UIを統一 — カードスタイル・padding・重複ヘッダー削除
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-11 12:11:21 +09:00
Ponshu Developer
675e67e3c1
refactor: デッドコード削除 — analyzeSakeHybrid/analyzeSakeText
...
- gemini_service.dart: 未使用の analyzeSakeHybrid / analyzeSakeText を削除
(どこからも呼ばれておらず、画像直接解析 analyzeSakeLabel のみ使用中)
- main.dart: isProVersion を「現在未使用」コメントに更新
- version: 1.0.28+35
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-11 09:19:03 +09:00
Ponshu Developer
d23ee8ed77
fix: AI解析プロンプトの銘柄名補完バグを修正
...
- 銘柄名(name)と蔵元名(brand)はラベルの文字をそのまま使うよう明示
「東魁」→「東魁盛」のような知識補完を禁止する指示を追加
- 全3プロンプト(画像解析・ハイブリッド・テキストのみ)に適用
- version: 1.0.27+34
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-11 08:58:02 +09:00
Ponshu Developer
f229ff6b4b
fix: 外部コードレビュー指摘の修正4件
...
device_service.dart:
- iOS device_idをSharedPreferencesにUUID永続化(identifierForVendor廃止)
→ 全ベンダーアプリ削除後の再インストール後もライセンスが継続する
- fallback device_idもSharedPreferencesに永続化
→ アプリ再起動のたびにIDが変わるバグを修正
license_service.dart:
- revokedキャッシュが24h後にfreeに降格するバグを修正
→ proとrevokedはキャッシュ有効期限の対象外にする
sake_mbti_stamp_section.dart / sake_detail_screen.dart:
- isProVersion(コンパイル時) → isProProvider(実行時ライセンス)に移行
→ ライセンス購入後にアプリ再起動なしでMBTIスタンプが有効になる
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-11 08:14:37 +09:00
Ponshu Developer
7b3249791e
fix: セルフコードレビュー修正 — ライセンス管理バグ4件
...
- license_service.dart: オフライン時にProキャッシュを上書きしないよう修正
(offline statusを受け取ったらキャッシュフォールバックを使う)
- license_service.dart: activate()でoffline状態を明示的にハンドル
(「キーが見つかりません」ではなく「接続できません」と表示)
- license_service.dart: ライセンスキーのバイト数コメントを修正 (16→6バイト)
- license_screen.dart: Pro画面の誤ったテキスト修正
(「AI解析無制限」→「すべてのPro機能」)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-11 06:42:35 +09:00
Ponshu Developer
659e81628a
chore: v1.0.26 — Pro版ライセンス管理リリース
...
- pubspec.yaml: 1.0.21+32 -> 1.0.26+33
- home_screen.dart: 不正な ';' を削除(構文エラー修正)
- releases.json: v1.0.26 に更新
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-11 00:23:36 +09:00
Ponshu Developer
5311241fe5
feat: ライセンス検証をVPSエンドポイントへ移行
...
- secrets.dart: posimaiBaseUrl を追加 (https://api.soar-enrich.com )
- license_service.dart: 検証URLをproxyから /api/ponshu/license/validate へ変更
+ LicenseStatus.trialExpired 参照バグを修正
+ _cachedTrialInfo 残骸変数参照を削除
- proxy/server.js: /license/validate と /admin/license/revoke を削除
(ライセンス管理はPostgreSQL + VPS server.js が担当)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-11 00:16:52 +09:00
Ponshu Developer
d47bb201ac
feat: ライセンス管理システムを追加(Pro機能解放型)
...
- LicenseService / LicenseProvider / LicenseScreen を追加
- main_screen.dart: isProVersion(ビルド時)→ isProProvider(ランタイム)に変更
ライセンスキー購入後にARスキャン・Analytics・Instagram支援が解放される
- home_screen.dart: 不要なTrialStatusBannerを削除(AI解析は常時無制限)
- proxy/server.js: トライアル回数制限・Stripe/Resendコードを削除(整理)
- proxy/package.json: stripe/resend依存を削除
- .github/workflows/ios_build.yml: iOS CI追加
- scripts/deploy_android.ps1: Android配布スクリプト追加
AI解析(1日50回)はLite版でも制限なし
Proライセンス購入でARスキャン・Analytics・Instagram支援を解放
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-11 00:05:53 +09:00
Ponshu Developer
fedfc6fa62
fix: code review fixes — data integrity, safety, architecture
...
C-2: draft_service — $i+1 → ${i+1} 文字列補間バグ修正
C-1: sake_item — setter内の unawaited save() を削除(呼び出し元で明示的に await)
H-2: sake_detail_screen — 再解析前に実ファイル存在チェック追加
M-4: gemini_exceptions.dart 新規作成、[CONGESTION]文字列マッチ→型チェックに変更
C-4: main.dart — migration_completed フラグ→ migration_version 番号管理に移行
既存ユーザーのデータは migration_version=1 扱いで安全に互換維持
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-10 08:26:53 +09:00
Ponshu Developer
7844fc314d
fix: UI tweaks — alcohol unit, title card layout, stats card
...
- sake_detail_specs: アルコール分チラ見せを % → 度 に統一
- level_title_card: Lv.バッジを「現在の称号」行右寄せに移動、称号名36→26px・1行制限
- activity_stats: 小カード(お気に入り・撮影日数)を横並びレイアウトに変更
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-09 19:27:25 +09:00
Ponshu Developer
182e498188
fix: save as draft when Gemini 503 exhausts all retries
...
When API congestion persists after 3 retries + fallback:
- Mark exception with [CONGESTION] tag
- camera_screen catches it and calls DraftService.saveDraft()
- Shows orange snackbar (same UX as offline) instead of red error
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-09 19:17:30 +09:00
Ponshu Developer
0d741c4cb0
fix: add retry + fallback for Gemini 503 UNAVAILABLE errors
...
- Retry up to 3 times with exponential backoff on 503/UNAVAILABLE
- Fall back to gemini-2.0-flash on final attempt
- Replace raw JSON error with user-friendly Japanese message
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-09 19:04:40 +09:00
Ponshu Developer
9587991999
feat(ponshu-room): Phase 3 UI — Bento Grid stats + progress bar animation
...
- activity_stats: Bento Grid layout (大カード×1 + 小カード×2) with AppColors tokens
- level_title_card: TweenAnimationBuilder progress bar (0→value, 900ms easeOutCubic)
- version bump: 1.0.20+31 → 1.0.21+32
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 17:04:20 +09:00
Ponshu Developer
db4af36f8b
fix: grid item separator / → · (consistent with list and detail screen)
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 16:50:51 +09:00
Ponshu Developer
a691be07fa
feat: simplify list item — accurate info only, remove AI-inferred tags
...
- 酒蔵 · 都道府県: / → · 区切りに変更(詳細画面と統一)
- フレーバータグ削除: AI推測精度が低いため一覧から除去(詳細画面のみ)
- 特定名称 + アルコール度数を追加: ラベル直読みの正確な情報のみ表示
(どちらか一方のみの場合も対応、両方ない場合は行自体を非表示)
- セット商品の説明文は維持(ユーザー入力のため)
- お気に入りアイコンは現状(右上)のまま維持
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 09:12:59 +09:00
Ponshu Developer
818f8862a1
feat: detail screen UI polish — badge merge, clean typography, spec peek, no dividers
...
変更1: AI確信度 + MBTI相性バッジを横並び1行に統合(Wrap)
変更2: 銘柄名・酒蔵から常時表示の鉛筆アイコンを除去、区切りを / → · に変更
キャッチコピーを銘柄名直下に移動、タグをpill形状(radius:20)に変更
変更3: スペック詳細アコーディオンのタイトルにアルコール度数・精米歩合をチラ見せ
変更4: Divider 4本 → SizedBox(height:32) に置換
おすすめ見出しカラーを colorScheme.onSurface → appColors.textPrimary に統一
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-05 14:55:21 +09:00
Ponshu Developer
4758aa5c9c
fix: remove Pro-only placeholder in consumer APK, fix A-1/A-3 visibility
...
- sake_detail_screen: hide SakeMbtiStampSection when isProVersion=false
(consumer APK no longer shows Pro版限定 placeholder at card bottom)
- sake_grid_item / sake_list_item: apply Pressable to actual tap targets
(grid/list cards now animate on press instead of non-interactive LevelTitleCard)
- soul_screen / sommelier_screen: ambient glow alpha 0.07→0.12 for visibility
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-05 14:33:40 +09:00
Ponshu Developer
a14dae1afb
feat: UI modernization Phase 2 — micro-animation, typography, ambient glow
...
A-1 Micro-animation: Pressable wrapper widget (AnimatedScale 0.97 on tap)
applied to LevelTitleCard
A-2 Bold Typography: LevelTitleCard title font 28→36px, 現在の称号 label
demoted to bodySmall for stronger visual contrast
A-3 Ambient Glow: RadialGradient circle behind My Page (top-left, brandPrimary)
and Sommelier screen (top-right, brandAccent) via Stack + IgnorePointer
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-05 13:35:03 +09:00
Ponshu Developer
1741e74639
feat: restructure My Page and Sommelier screen layouts
...
My Page:
- LevelTitleCard: show nickname above title when set
- Add section header 成長記録 above gamification widgets
- Split profile card: basic info (nickname/gender) and sake character
(MBTI/sake persona) are now separate named sections
Sommelier:
- Add section headers テイストプロフィール / MBTI風診断 / さけのわ おすすめ
- Widen share button to full width with rounded rect shape
- Remove Dividers between sections, use SizedBox(32) spacing instead
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-05 13:32:52 +09:00