Commit Graph

113 Commits

Author SHA1 Message Date
Ponshu Developer d39db78c80 chore: update download page to v1.0.40
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-16 14:04:01 +09:00
Ponshu Developer 4e6ff6d6e9 chore: bump version to 1.0.40+47
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-16 14:01:27 +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 fad896e817 chore: update download page to v1.0.39 (actual APK sizes)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-16 13:40:23 +09:00
Ponshu Developer 26183e458e chore: update download page to v1.0.39
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-16 13:27:01 +09:00
Ponshu Developer cad2855b6e chore: bump version to 1.0.39+46
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-16 13:24:58 +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 ef2d940b6a docs: add DESIGN.md for UI/UX principles and customization guidelines
Made-with: Cursor
2026-04-16 13:10:48 +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 ee7e3b2646 fix: increase curl upload timeout 300s -> 900s for large APK uploads
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-16 09:28:51 +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 cb152ef78a fix: remove unused apkInfo variable in release_to_gitea.ps1
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-15 13:41:28 +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 4f2f438b84 chore: bump version to 1.0.35+42
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-15 13:35:46 +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 7a20f161dd fix: replace WebClient with curl.exe for APK upload (5min timeout)
WebClient.UploadData() has no configurable timeout and was silently
timing out on 89MB uploads over Tailscale. curl.exe (built-in on
Windows 10+) is used instead with --max-time 300 (5 minutes).

Made-with: Cursor
2026-04-12 10:08:19 +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 cb71ab91de fix: handle Vercel CLI stderr as ErrorRecord in release script
- Set ErrorActionPreference to Continue before vercel commands to prevent
  PowerShell from treating Vercel CLI stderr output (version banner) as
  a terminating error and jumping to the catch block prematurely
- Strip ANSI cursor-movement escape codes from output before regex matching
  the Production URL (--no-color does not remove cursor movement sequences)
- Convert all 2>&1 output to strings via .ToString() before processing

Made-with: Cursor
2026-04-12 00:39:35 +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 2074f85da8 fix: show correct file size (decimal) on download page
Made-with: Cursor
2026-04-11 22:39:11 +09:00
Ponshu Developer d688dfa5bd chore: bump version to 1.0.30+37
Made-with: Cursor
2026-04-11 15:47:00 +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 4096c67356 chore: update download page and add build script for v1.0.29
Made-with: Cursor
2026-04-11 15:13:04 +09:00
Ponshu Developer cccea8dd7a chore: bump version to 1.0.29+36
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-11 12:19:11 +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 ba5660c1cb fix: release_to_gitea.ps1にAPKバージョン一致チェックを追加
pubspec.yamlのversionとAPKの埋め込みversionNameが異なる場合は
エラーで中断する。「バージョン上げ前ビルド→リリース」ミスを防ぐ。

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-11 09:45:16 +09:00
Ponshu Developer 402c6b6448 chore: update download page to v1.0.28
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-11 09:19:31 +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 c7168e831c chore: update download page to v1.0.27
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-11 08:58:42 +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 f3d6a92799 chore: v1.0.26 リリース完了 — APKアップロード・ダウンロードページ更新
- releases.json: v1.0.26 のダウンロードURLに更新
- release_to_gitea.ps1: consumer命名に統一 (lite/pro分割廃止)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-11 08:23:10 +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 2b90756417 chore: update download page to v1.0.25 2026-04-10 16:39:40 +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 30c15b553d chore: update download page to v1.0.24 2026-04-09 19:32:07 +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 3cbd9bad2c chore: update download page to v1.0.23 2026-04-09 19:22:21 +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 b3d07f8794 chore: update download page to v1.0.22 2026-04-09 19:12:25 +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 d1a41b4d3b chore: update download page to v1.0.21 2026-04-06 17:14:29 +09:00